Podědění Nette\Security\User

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

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

Co je na tom tak těžkého?

services:
	user:
		class: MyUserClass(@userStorage, @container)

Editoval HosipLan (15. 1. 2012 16:24)

pekelnik
Člen | 462
+
0
-

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

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

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

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

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

Ani napsal(a):

… Kdyz je tech zavislosti hodne…

Tak je někde něco špatně.

pekelnik
Člen | 462
+
0
-

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

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 a authenticator, 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
+
0
-

@**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.

ma3x
Člen | 1
+
0
-

Neviem prečo ale mene sa to nepodarilo sfunkčniť. Ladenka píše chybu: „No service of type IUserStorage found“. Predpokladám, že ešte treba niečo dopísať do configu, ale neviem čo.

Poradí mi niekto ako to vyriešiť?