Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

Diskusia – 5. diel - Zlé spôsoby odovzdávania závislostí - Singleton a SL

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
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?

Editované 27.8.2017 14:59
Odpovedať
27.8.2017 14:58
obsah kocky = r^2 ... a preto vlak drnká
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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?

Odpovedať
27.8.2017 15:37
New kid back on the block with a R.I.P
Avatar
Odpovedá 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.

Odpovedať
27.8.2017 17:50
obsah kocky = r^2 ... a preto vlak drnká
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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.

Odpovedať
27.8.2017 18:21
New kid back on the block with a R.I.P
Avatar
Odpovedá 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.

Odpovedať
27.8.2017 21:00
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovedá 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.

Odpovedať
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...

Odpovedať
20.11.2017 22:28
Když se chce, hledá se jak, když se nechce, hledá se proč
Avatar
Michal D.
Tvůrce
Avatar
Odpovedá 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', '');
    }
 
Odpovedať
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?

Editované 22.9.2023 16:30
 
Odpovedať
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ů.

 
Odpovedať
22.9.2023 16:33
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!