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
authorizator
aauthenticator
, 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.