registracia novych uzivatelov – hlasi chybu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Takeshi
Člen | 596
+
0
-

Ahojte, skopíroval som, podľa dokumentácie RegisterPresenter … ale hlási mi chybu

Service 'users' not found.

neviem ako tam to niečo pridať, aby mi to šlapalo … dik za pomoc

David Kudera
Člen | 455
+
0
-

Ahoj, podle které dokumentace přesně? Jinak ten RegisterPresenter někde požaduje službu users, ale ty žádnou takovou v konfiguraci registrovanou nemáš

David Kudera
Člen | 455
+
0
-

Hned ve startup k tomu přistupuje přes context.

$this->users = $this->context->users;

Což by se mimochodem nemělo, tady na fóru je několik příspěvků, jak správně přistoupit ke službám uvnitř presenteru.

No a k problému.. Budeš si tam muset přidat tu službu users.

Edit: ten context nakonec docela chápu, přece jen ten článek je už trochu starší

Editoval David Kudera (14. 7. 2014 11:47)

Takeshi
Člen | 596
+
0
-

David Kudera napsal(a):

Hned ve startup k tomu přistupuje přes context.

$this->users = $this->context->users;

Což by se mimochodem nemělo, tady na fóru je několik příspěvků, jak správně přistoupit ke službám uvnitř presenteru.

No a k problému.. Budeš si tam muset přidat tu službu users.

OK ale ako ?

Takeshi
Člen | 596
+
0
-

A ked nie … ako inak by sa dala riešiť registrácia?

David Kudera
Člen | 455
+
+1
-

No… Tak, že si přečteš celý ten seriál a ne jen část uprostřed ;-) Tady se vytváří ta služba users totiž

Takeshi
Člen | 596
+
0
-

No nech kukam jak kukam, neviem sa z toho vysomarit … aj som skusal pridat sluzbu ale nejde
pravdepodobne to robim zle, ale neviem ako inak to mam robit … prosim o konkretny priklad …
ja som pridal nasledovne

services:
	- App\Model\UserManager
	- App\RouterFactory
	router: @App\RouterFactory::createRouter
	users:
		class: \Users
David Kudera
Člen | 455
+
0
-

jj to je správně.. Hlásí ti to nějakou chybu? A tu třídu Users jsi tam zkopíroval?

Pavel Macháň
Člen | 282
+
0
-

Takeshi napsal(a):

No nech kukam jak kukam, neviem sa z toho vysomarit … aj som skusal pridat sluzbu ale nejde
pravdepodobne to robim zle, ale neviem ako inak to mam robit … prosim o konkretny priklad …
ja som pridal nasledovne

services:
	- App\Model\UserManager
	- App\RouterFactory
	router: @App\RouterFactory::createRouter
	users:
		class: \Users

Stačí jen

services:
	- App\Model\UserManager
	- App\RouterFactory
	router: @App\RouterFactory::createRouter
	- \Users

Každopádně nepoužívej context ale dostaň to tam konstruktorem (s tímto zápisem bys to ani jako $this->context->users tahat nemohl)

class RegisterPresenter extends BasePresenter {

    /** @var Users */
    private $users;

    public function __construct(\Users $users) {
        parent::startup();
        $this->users = $users;
    }
}

Editoval Pavel Macháň (14. 7. 2014 12:40)

Takeshi
Člen | 596
+
0
-

David Kudera napsal(a):

jj to je správně.. Hlásí ti to nějakou chybu? A tu třídu Users jsi tam zkopíroval?

Trieda Users vyzerá nasledovne

<?php
class Users extends \Nette\Object {

    /** @var \DibiConnection */
    private $db;
    private $table = "users";
    public static $user_salt = "AEcx199opQ";

    public function register($data) {
        unset($data["password2"]);
        $data["role"] = "guest";
        $data["password"] = sha1($data["password"] . self::$user_salt);
        return $this->db->insert($this->table, $data)->execute(dibi::IDENTIFIER);
    }
}
?>

A hlási chybu

Class \Users used in service 'users' has not been found or is not instantiable.

btw … kedysi to bolo lahsie… stacilo zavolat

\Model\UserManager::calculateHash($values->newPass)

… teraz ako sa zmenila trieda UserManager … somm z toho vedla

David Matějka
Moderator | 6445
+
+1
-

V nette 2.2 je pro hashovani hesel trida Nette\Security\Passwords, pro hashovani nepouzivej sha1 ani md5. Viz UserManager v sandboxu (kde je i metoda na pridani uzivatele)

a kde mas ulozenou tu tridu „Users“?

Editoval matej21 (14. 7. 2014 13:01)

David Kudera
Člen | 455
+
0
-

Spíš se jen víc začli používat čistější návrhy. Ještě mě napadá, v novým Nette je třída Passwords pro hashování i kontrolu hesla, která se hodí určitě víc.

No a ta třída Users nemá žádný namespace? Např. Model\Users

Takeshi
Člen | 596
+
0
-

.. v priecinku model

Takeshi
Člen | 596
+
0
-

Poprípade ak tu už niekto riešil registráciu po novom, by mi mohol poslať zdrojak …

Takeshi
Člen | 596
+
0
-

David Kudera napsal(a):

Spíš se jen víc začli používat čistější návrhy. Ještě mě napadá, v novým Nette je třída Passwords pro hashování https://forum.nette.org/…ilk/php.pngi kontrolu hesla, která se hodí určitě víc.

No a ta třída Users nemá žádný namespace? Např. Model\Users

Takže aby som bol úplne presný … mám to spravené takto …

Users

<?php

namespace App\Presenters;

use Nette,
	App\Model;

class Users extends \Nette\Object {

    /** @var \DibiConnection */
    private $db;
    private $table = "users";
    public static $user_salt = "AEcx199opQ";

    public function register($data) {
        unset($data["password2"]);
        $data["role"] = "guest";
        $data["password"] = sha1($data["password"] . self::$user_salt);
        return $this->db->insert($this->table, $data)->execute(dibi::IDENTIFIER);
    }
}
?>

config.neon

...
services:
	- App\Model\UserManager
	- App\RouterFactory
	router: @App\RouterFactory::createRouter
	users:
		class: App\Model\Users

je tam nieco, co by malo byt inak?

Editoval Takeshi (14. 7. 2014 14:13)

David Matějka
Moderator | 6445
+
0
-

uz jsem to psal, koukni na user manager v novem sandboxu

David Kudera
Člen | 455
+
0
-

A já tu nechám jeden odkaz, který se hodí přečíst: Namespaces. Btw taky jste si všimli, že poslední dobou je tady největší problém s namespacy a že snad v každém příspěvku je odkaz na jejich dokumentaci?

No a píšu to proto, že třídu Users máš z nějakého důvodu v namespace App\Presenters, ale registruješ ji jako App\Model\Users.

Neber si to nijak špatně prosím, co jsem tu napsal.

Takeshi
Člen | 596
+
0
-

matej21 napsal(a):

uz jsem to psal, koukni na user manager v novem sandboxu

Aha, jasne prepac … nevsimol som si … otazka je ako tuto funkciu add zavolat v presenteru RegisterPresenter

David Matějka
Moderator | 6445
+
0
-

@DavidKudera

Btw taky jste si všimli, že poslední dobou je tady největší problém s namespacy a že snad v každém příspěvku je odkaz na jejich dokumentaci?

ano :) asi to bude tim, ze uz neni podporovana verze nette bez namespaces

David Matějka
Moderator | 6445
+
0
-

@Takeshi injectni UserManager a zavolej metodu add

class RegisterPresenter extends ...
{
	/** @var \App\Model\UserManager @inject */
	public $userManager;

	public function nejake_zpracovani_formulare(...)
	{
		...
		$this->userManager->add($username, $password);
	}
}

Editoval matej21 (14. 7. 2014 14:32)

Takeshi
Člen | 596
+
0
-

OK, funguje … ďakujem za trpezlivosť :-D

Mysteria
Člen | 797
+
0
-

matej21 napsal(a):
ano :) asi to bude tim, ze uz neni podporovana verze nette bez namespaces

Já si spíš myslím, že je to tím, že většina nováčků v Nette psala předtím v PHP procedurálně špagetu a tohle je jejich první vážnější setkání s namespacema.