Registracia uzivatelov s Acl autorizaciou
- NiNu
- Člen | 31
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.
- NiNu
- Člen | 31
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
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
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
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
Ď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.
- NiNu
- Člen | 31
Twista napsal(a):
NiNu napsal(a):
Keď Repository a UsersRepository priradím namespace Main, tak mi v modely Repository na riadkuPotrebujem 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.