Jak nastavit jinou třídu IUser pro každý modul zvlášť
- jtousek
- Člen | 951
Ahoj, narazil jsem na takový problém se kterým si nevím moc rady.
Typicky potřebuju v administraci (AdminModule) přihlašovat nějaké uživatele – administrátory, kteří spravují obsah webu (např. e-shopu). Dále potřebuju na frontendu (FrontModule) přihlašovat jiné uživatele – registrované zákazníky. Tyto dva typy účtů jsou ve vech ohledech naprosto nezávislé, v databázi se ukládají do jiných tabulek.
Otázka zní. Jak v config.ini nastavím service IUser
, aby pro
každý modul vzala jinou třídu User? Pro administraci třídu
\AdminModule\User
a pro frontend třídu
\FrontModule\User
.
Řešení by mělo být, jak doufám, jednoduché. Pokud není, berte to jako feature request.
- Filip Procházka
- Moderator | 4668
User
bys podle mě moc měnit neměl, User
by měl
být jenom něco jako obálka na Identitu a ACL. Nemyslím si, že potřebuješ
měnit třídu User
.
Co takhle použít Nette\Web\User::setNamespace(), pro odlišení, ve které části aplikace jsi. Můžeš tak mít více Identit pro jednu session. To mi příjde jako nejlepší řešení.
Logiku, kterou chceš cpát do User
bych do něj vubec nedával.
Ale dal ji úplně bokem a v různých částech aplikace, používal jinou
logiku. Říká se tomu myslím Strategy
Pattern.
Můžeš si pak v AdminModule/BasePresenteru
udělat instanci
nějakého UserManager
, nebo co vlastně potřebuješ a s tím pak
pracovat v celém modulu. S tím rozdílem, že v AdminModule
to bude
namespace AdminModule;
class BasePresenter extends \BasePresenter
{
private $userManager;
protected function startup()
{
parent::startup();
$this->userManager = new AdminUserManager(Nette\Environment::getUser());
}
public function getUserManager()
{
return $this->userManager;
}
Ve FrontModule
(nebo jiném) bude
namespace FrontModule;
class BasePresenter extends \BasePresenter
{
private $userManager;
protected function startup()
{
parent::startup();
$this->userManager = new FrontUserManager(Nette\Environment::getUser());
}
public function getUserManager()
{
return $this->userManager;
}
A v tom už můžeš mít co chceš. Asi by bylo taky dobré si nadefinovat nějaké interface
- jtousek
- Člen | 951
To co popisuješ mi připadá až moc složitý…
User bys podle mě moc měnit neměl, User by měl být jenom něco jako obálka na Identitu a ACL.
Potřeboval jsem pro ACL přidat třídě User nějaké metody. Samozřejmě na frontendu je to zbytečné, neboť tam ACL není.
Nicméně už teď používám pro frontend a administraci samostatný bootstrap (různé nastavené laděnky, administrace používá Doctrine, která je ale pro frontend neohrabaná, atd.) takže zřejmě rozdělím i config.ini.
- Filip Procházka
- Moderator | 4668
To smrdí nekonzistencí, ale jak to zbastlíš je samozřejmě na tobě :) a není to složité, jenom je to rozdělené na více třídy, kdybys řekl hned že chceš upravovat ACL, poradil bych ti ať upravuješ Permission a ne User