IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 5 - Špatné způsoby předávání závislostí - Singleton a SL

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Matúš Petrofčík:27.8.2017 14:58

Som zvedavý na IoC a DI (ďalší článok). Pravdu povediac, pracujem v Zend Framework-u 3 a tam je práve service locator (alebo skôr container), ale nikdy som ho nepredával celý controller-u tak ako je to v ukážkach. Vždy sa vytvorí pre daný controller factory (továrnička) a len v nej je prístup k service locator-u, z ktorého sa vyberú potrebné závislosti, vytvorí controller (závislosti sa predajú cez __construct) a vráti sa inštancia controller-u. Tiež je to nesprávny spôsob?

Editováno 27.8.2017 14:59
Odpovědět
27.8.2017 14:58
obsah kocky = r^2 ... a preto vlak drnká
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Matúš Petrofčík
David Hartinger:27.8.2017 15:37

A jak potom z kontroleru předáváš závislosti těm modelům?

Odpovědět
27.8.2017 15:37
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Matúš Petrofčík:27.8.2017 17:50

Uvediem príklad ako to funguje v ZF3:

Mám UserController, a ten má nejaké závislosti, ktoré sú mu predané pri jeho vytváraní v UserController­Factory.

Jednou z tých závislostí je UserFacade, ktorá má tiež nejaké závislosti predané pri vytváraní pomocou UserFacadeFactory.

Takou závislosťou pre UserFacade je EntityManager pre prácu s Doctrine, a tá má niekde tiež vlastnú EntityManager­Factory :D atď...

Chcem použiť ten UserController, ale ešte ho nemám vytvorený (vytvára ho Router a doteraz som inak závislosti než pomocou factory nepredával). Router sa pozrie či má UserController nejaké závislosti (a k tomu určenú továrničku), a ak áno, tak ho vytvorí pomocou UserController­Factory.

V tej UserController­Factory sa zo service locator-u (container po novom) vyťahujú potrebné závislosti, napr. tá UserFacade. Service locator sa pozrie, či už ju má vytvorenú, a ak nie, vytvorí ju. Pri jej vytváraní sa pozerá, či má UserFacade nejaké závislosti a k tomu potrebnú UserFacadeFactory. Ak aj UserFacade má závislosti, napr. ten EntityManager, tak ho zas vytvorí, atď až má všetko pripravené.

V konečnom dôsledku zjednodušene vytvorí EntityManager, ten vloží ako závislosť pri vytvorení UserFacade, a tú vloží ako závislosť pri vytvorení UserController-u. Všetky inštancie tak majú všetky pre seba potrebné závislosti, ale nemajú v skutočnosti prístup k ničomu inému. K service locator-u majú prístup iba továrničky, aby mohli získavať a predávať závislosti (samozrejme pokiaľ sami nepredáme celý service locator, ale to by skúsený programátor neurobil).

Ak sa raz vytvorí UserController alebo UserFacade alebo EntityManager, tak sa už pri jeho potrebe niekde inde nevytvára znovu pokiaľ si to explicitne od service locator-u nevyžiadame.

Tie factory dokonca nie je potrebné definovať, dá sa to aj automatizovať, ale osobne ich vždy vytváram pretože občas nie je jasné čo sa tam má predať (ak sa ako závislosti definujú rozhrania namiesto konkrétnych tried).

PS: EntityManager je tiež tak trochu service locator, pretože sa pomocou neho dajú vytvárať/získavať repozitáre pre entity, ale na to kašlime.

Odpovědět
27.8.2017 17:50
obsah kocky = r^2 ... a preto vlak drnká
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Matúš Petrofčík
David Hartinger:27.8.2017 18:21

Pokud to je opravdu takhle, tak je to variace service lokátoru a manuálního předávání, protože to musíš stejně ručně tahat z lokátoru v té továrničce. IMHO to není moc šťastné řešení, ještě jsem neviděl, že by se musela pro všechny závislosti vytvářet továrna.

Odpovědět
27.8.2017 18:21
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Matúš Petrofčík:27.8.2017 21:00

Je dosť možné že existuje aj iný spôsob :) Dík za odpovede.

Odpovědět
27.8.2017 21:00
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na David Hartinger
Matúš Petrofčík:27.8.2017 21:15

Tak som si to rýchlo pozrel a predsa má ZF3 balíček zend-di, ktorý ponuka práve IoC Container. Avšak v dokumentácii pre zend-di sa odporúča používať zend-servicemanager, ktorý je ZF3 východzí (a preto sa píšu tie továrničky). Zaujímavé, ani som o tom nevedel.

Unlike zend-di, zend-servicemanager is code-driven, meaning that you tell it what class to instantiate, or provide a factory for the given class. This approach offers several benefits:

  • Easier to debug (error stacks take you into your factories, not the dependency injection container).
  • Easier to setup (write code to instantiate objects, instead of configuration).
  • Faster (zend-di has known performance issues due to the approaches used).

Unless you have specific needs for a dependency injection container versus more general Inversion of Control, we recommend using zend-servicemanager for the above reasons.

Odpovědět
27.8.2017 21:15
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Libor Sitek
Člen
Avatar
Libor Sitek:20.11.2017 22:28

U příkladu použití Service Locatoru máš ve třídě ServiceLocator definovaný privátní kontruktor, v souboru index.php pak vytváříš instanci této třídy...

Odpovědět
20.11.2017 22:28
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Michal D.
Tvůrce
Avatar
Odpovídá na Libor Sitek
Michal D.:19.7.2022 8:04

nejen, že je privátní, ale neobsahuje ani klíčové slovo function

private __construct()

správně tedy takto:

public function __construct()
    {
        // Může být i líně
        $this->databaze = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'root', '');
    }
 
Odpovědět
19.7.2022 8:04
Avatar
Pavel Polívka:22.9.2023 16:28

Proč neopravite ten privátní konstruktor? Zbytečně tím matete čtenáře/studenty. Bylo by prosím možné ho opravit?

Editováno 22.9.2023 16:30
 
Odpovědět
22.9.2023 16:28
Avatar
Pavel Polívka:22.9.2023 16:33

Dlouho neopravená chyba v definici privátního konstruktoru. Viz poslední příspěvky uživatelů.

 
Odpovědět
22.9.2023 16:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.