Registracia uzivatelov s Acl autorizaciou

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

Zdravim,
som zaciatocnik s Nette, prebehol som vsetky dostupne navody a teraz skusam Nette sam, no potreboval by som poradit a utriedit si niektore veci.

Spravil som si Statické ACL podla navodu a teraz do toho chcem spravit registraciu uzivatelov. Cize mam FrontModule, AdminModule a teraz vo Fronte riesim registraciu.

Mam vytvorene Model: Repository a UsersRepository
a Presenter: RegisterPresenter
Authenticator.php zo sandboxu mam podla navodu Acl v libs/Acl/Security/
Moj config.neon

Problem mam s registraciou, konkretne ked po uspesnom odoslani registracneho formulara zavolam metodu register, ktora je v UsersRepository a kontretne pri tomto riadku:

<?php
$data['password'] = Authenticator::calculateHash($data['password']);
?>

Samozrejme mi to vypisuje Class 'Authenticator' not found, skusal som to roznymi sposobmi, ale nic mi nefunguje.

Este jedna organizacna otazka aj v modeloch sa uvadza namespace? Adresar Model mam samostatne od Admin a FrontModulu.
Diky moc.

enumag
Člen | 2118
+
0
-

No když ti to hází class Authenticator not found tak ti asi chybí

use Acl\Security\Authenticator;

Osobně snažím nepoužívat třídy bez namespace, takže i pro model nějaký NS zavádím (nutné to smaozřejmě není).

NiNu
Člen | 31
+
0
-

OK, ďakujem moc, registrácia aj prihlasovanie už plne fungujú, už viem kde som robil chybu.
Ešte jednu malú otázočku trocha mimo témy:

<?php
protected function startup() {
parent::startup();
$this->users = $this->context->usersRepository;
}
?>

týmto si sprístupním v presentery usersRepository a jeho metody, je to dobré používať v startup funkcii, alebo som to už videl aj v samostatnej funkcii inject.
Diky moc.

Jiří Nápravník
Člen | 710
+
0
-

Není to dobré, contextu se doporučuje vyhnout a použít DI přístup. Tudíž inject metoda, případně v 2.1-dev verzi je anotace @inject

kde bys to zavolala takto

/**
* @inject
* @var namespaces/UserRepository
*/
public $userRepository; //MUSÍ byt public

Editoval Jiří Nápravník (18. 10. 2013 10:03)

NiNu
Člen | 31
+
0
-

Nette mam 2.0.12
Všade čo čítam sa injection robí priamo v konštruktore, ktorý je teda preferovaný spôsob?

<?php
public function __construct(namespace\UsersRepository $usersRepository) {
	$this->usersRepository = $usersRepository;
}
?>

alebo

<?php
public function injectUsersRepository (namespace\UsersRepository $usersRepository) {
	$this->usersRepository = $usersRepository;
}
?>

?

jiri.pudil
Nette Blogger | 1029
+
0
-

U presenterů je situace trošku komplikovanější, protože z nich obvykle vytváříš nějakou hlubší strukturu. Jakoukoliv změnu v závislostech BasePresenteru bys pak musel propisovat do všech poděděných presenterů, které k tomu přidávají nějaké vlastní závislosti (a tudíž rozšiřují konstruktor). Proto se jako obezlička používá v presenterech injektování, ať už pomocí metody, nebo (ve 2.1) anotované property. Ve všem, co není presenter, je čistší použít constructor injection.

NiNu
Člen | 31
+
0
-

Ďakujem, už mi je to jasné a ešte jednu malú otázočku mám ohľadom namespace:
Zatiaľ to mám rozdelené nasledovne:
FrontModule – jeho presentery majú namespace ForntModule a AdminModule – majú namespace AdminModule.
Potom mám Modely, kde mám Repository a UsersRepository (tieto by mali byť spoločné pre Front aj AdminModule).

Keď Repository a UsersRepository priradím namespace Main, tak mi v modely Repository na riadku

class Repository extends Nette\Object {

začne vyhadzovať chybu:

Class 'Main\Nette\Object' not found

Potrebujem to trochu vysvetliť, pls.

Twista
Člen | 48
+
0
-

NiNu napsal(a):
Keď Repository a UsersRepository priradím namespace Main, tak mi v modely Repository na riadku

Potrebujem to trochu vysvetliť, pls.

Protože PHP pak hledá Nette\Object v namespace Main, použij

<?php
extends \Nette\Object
?>
NiNu
Člen | 31
+
0
-

Twista napsal(a):

NiNu napsal(a):
Keď Repository a UsersRepository priradím namespace Main, tak mi v modely Repository na riadku

Potrebujem to trochu vysvetliť, pls.

Protože PHP pak hledá Nette\Object v namespace Main, použij

<?php
extends \Nette\Object
?>

OK, fungovalo, síce mi to potom ešte vyhodilo ďalšie chyby, ale tie som už sám vyriešil.
Ďakujem.