Jak nastavit jinou třídu IUser pro každý modul zvlášť

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

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
+
0
-

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
+
0
-

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
+
0
-

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