Podědění Nette\Security\User

- spidy
 - Člen | 55
 
Právě jsem si stáhnul novou verzi nette. Mám poděděného Usera a dříve stačilo pro jeho používání podědit ještě Configurator a přepsat metodu createServiceUser. V nové verzi ovšem Configurator žádnou takovou metodu nemá a v configu to stále nefunguje (nejprve chyběl context, potom jsem si všiml, že se v constructoru objevil další parametr IUserStorage $storage, takže teď dostávám chybu „Class IUserStorage does not exist“). Zkoušel jsem vymazat cache, ale to nepomohlo.
Nenapadá někoho řešení, jak nyní podědit Nette\Security\User?

- Filip Procházka
 - Moderator | 4668
 
Co je na tom tak těžkého?
services:
	user:
		class: MyUserClass(@userStorage, @container)
					Editoval HosipLan (15. 1. 2012 16:24)

- pekelnik
 - Člen | 462
 
Autowiring tam storage doplní automaticky.
Pokud ta třída vypadá takto:
class MyUserClass {
	function __construct(Nette\Security\IUserStorage $storage) {}
}
stačí napsat do configu tohle:
services:
        user:
                class: MyUserClass
Cpát tam kontejner bych snad lidi ani nenaváděl… B-)
Kdo potřebuje kontejner měl by se nad tím nedřív 2× zamyslet a pak si tam poslat jen tu službu, kterou opravdu potřebuje. A především úplně ZAPOMENOUT, že nějaký kontejner vůbec existuje.
Jak pravý klasik: „Lží… ehm, kontejner tu ve skutečností není.“
class MyUserClass {
	function __construct(Nette\Security\IUserStorage $storage, CoolService $cool) {}
}
					Editoval pekelnik (15. 1. 2012 18:30)

- Nox
 - Člen | 378
 
Ad kontejner – naprosto souhlasím:
- neví se pak, co ten objekt/funkce chce
 - neprovádí se tedy kontrola, nebo se musí manuálně
 - pokud se změní závislosti, nezmění se prototyp funkce/konstruktoru (nebo jak se tomu říká u dynamických)
 - lehce jde pak tvořit funkce/třída, která využívá mnoho závislostí
 
(atd.?)

- spidy
 - Člen | 55
 
Kontejner tam být musí – požaduje ho samotný Nette\Security\User. Jinak děkuji HosipLanovi, v té starší verzi Nette neexistoval service @container, takže to takhle nešlo…

- Ani
 - Člen | 226
 
Nox napsal(a):
Ad kontejner – naprosto souhlasím:
- neví se pak, co ten objekt/funkce chce
 - neprovádí se tedy kontrola, nebo se musí manuálně
 - pokud se změní závislosti, nezmění se prototyp funkce/konstruktoru (nebo jak se tomu říká u dynamických)
 - lehce jde pak tvořit funkce/třída, která využívá mnoho závislostí
 (atd.?)
Konstruktor taky neni samospasny. Kdyz je tech zavislosti hodne, slozitejsi struktura dedeni, tak pak pridavat jednu sluzbu do uplne prvniho predka neni uplne jednoduche.

- Filip Procházka
 - Moderator | 4668
 
Pánům pekelnik a Nox děkuji za naprosto zcestné příspěvky ;) Třída User kontejner vyžaduje.
Také bych vám doporučil zamyslet se nad tímto článkem. Co je akademicky čisté nemusí být prakticky použitelné, je potřeba mezi tím rozlišovat zdravým rozumem ;)

- Patrik Votoček
 - Člen | 2221
 
Ani napsal(a):
… Kdyz je tech zavislosti hodne…
Tak je někde něco špatně.

- pekelnik
 - Člen | 462
 
@HosipLan: to že třída User něco
požaduje ještě neznamená, že to je pravý smysl života, vesmíru
a vůbec.
Sice jsem to neověřil před napsáním svého komentáře, ale to na věci nic nemění.
public function __construct(IUserStorage $storage, Nette\DI\IContainer $context)
{
	$this->storage = $storage;
	$this->context = $context; // with IAuthenticator, IAuthorizator
}
Navíc tohle je zrovna ukázkový případ zbytečného
předávání celého kontejneru, v situaci kdy třída potřebuje pouze
služby authorizator a
authenticator, jak je ostatně popsáno v tom
komentáři.
public function __construct(IUserStorage $storage, IAuthenticator $authenticator, IAuthorizator $authorizator)
{
	$this->storage = $storage;
	$this->authenticator = $authenticator;
	$this->authorizator = $authorizator;
}
				
- Patrik Votoček
 - Člen | 2221
 
pekelnik napsal(a):
Navíc tohle je zrovna ukázkový případ zbytečného předávání celého kontejneru, v situaci kdy třída potřebuje pouze služby
authorizatoraauthenticator, jak je ostatně popsáno v tom komentáři.
To není tak úplně pravda. To že se tam předává přímo kontejner má trochu jiný význam. A to lazy-loading. Aby se authorizator a authenticator inicializoval až když je skutečně potřeba.

- Filip Procházka
 - Moderator | 4668
 
@**pekelnik**: V první řadě, pláčeš na špatném hrobě, tohle téma se zabývá problémem konkrétního člověka, který ho už dávno vyřešil. Pokud se ti nelíbí, jak něco v Nette funguje, sepiš RFC, pošli pull, ale nepiš zcestné příspěvky do tématu, kterého se to netýká.
To že se Userovi předává celý container má hned několik důvodů. Jednak lazy loading a jednak výměna authorizatoru a authenticatoru „za běhu“.
Prosím o zamčení, než tu někdo bude šířit další bludy.