PHP Dependency Injection
UVODEvo nakon nekoliko godina neaktivnosti odluÄio sam podijeliti svoj Dependency Injection bundle za sve koji rade UCP / ACP za svoje servere. Znam da veÄinom koristite PHP oni koji to radite. Kako me dugo nije bilo vidim da napokon većina servera koristi neke konkretne baze za spremanje (MySQL prvenstveno). Htio bi pomoći onima koji rade UCP / ACP panele, ako već rade da im pomognem da to rade na puno pravilniji naÄin nego Å¡to sam stekao dojam da rade.
Pa hajdemo redom, što je to ustvari Dependency Injection (skraćeno DI)?
U nekom doslovnom prijevodu, a koji bi bio najprimjereniji za Software i programiranje bilo bi: dodjeljivanje ili nasljeÄ'ivanje instance objekta / varijabli nekog drugog objekta, to je to :) bez previÅ¡e filozofije.
Dependency inversion princip teži da rijeÅ¡i baÅ¡ problem zavisnosti izmeÄ'u objekata na sljedeći naÄin
Moduli višeg nivoa ne treba da zavise od modula nižeg. Oba modula treba da zavise od apstrakcije
Apstrakcija ne treba da zavisi od detalja. Detalji treba da zavise od apstrakcije.
Kada idete raditi neku veliku aplikaciju ili enterprise rjeÅ¡enje koje treba jednom napisati da radi i nakon 30 godina skoro uvijek u poÄetku se smiÅ¡lja aplikacijska arhitektura, a jedan od temelja arhitekture je definitivno DI<?phpclass DependencyContainer { protected static $_storage = array(); // Dodaj objekt / varijablu u container public static function addToContainer($object, Closure $resolve) : void { static::$_storage[$object] = $resolve; } // Dohvati instancu objekta / varijable unutar containera public static function fetchContainer($object) : object { if(static::fetchContainer($object)) { $object = static::$_storage[$object]; return $object(); } throw new Exception('Na ovoj lokaciji nije niÅ¡ta pohranjeno.'); } // Dali se objekt / varijabla nalazi u containeru public static function existsContainer($object) : bool { return array_key_exists($object, static::$_storage); }}
Na poÄetku lifecycle-a vaÅ¡e aplikacije morate napraviti instancu DI klase i zapravo u nastavku ciklusa možete pristupati ili dodavati objekte / varijable u kontejner
Primjer:
<?phpDependencyContainer::addToContainer('user_model', function() { $users = new UserModel(); $users->fetchAllUsers(); return $users;});
Pretpostavimo da naÅ¡a aplikacija ima Usere i da sve akcije vezane s bazom i usera stavljamo u User Model i da ćemo trebati kad-tad u nekom djelu aplikacije koristiti taj model, pravilno smo ga dodali u naÅ¡ kontejner i po potrebi ćemo ga uÄitati kada će nam to biti potrebno.
Primjer:
<?php$metoda = 'fetchUserByID'; $users = DependencyContainer::fetchContainer('user_model');$users->{$metoda}($user_id); // bum! evo usera, pozvan iz dinamicne metode
Naravno, ukoliko imate nekakav model, kontroler ili library za koji niste sigurni hoće uvijek biti dostupan ili dali mu možete pristupiti unutar kontejnera, možete prije toga provjeriti dali instanca objekta ili varijable se nalazi unutar kontejnera
Primjer:
<?phpif(DependencyContainer::existsContainer('user_model') === TRUE){ // tek sada znamo da možemo Äitati user_model iz kontejnera $users = DependencyContainer::fetchContainer('user_model'); $users->fetchUserByID($user_id); // na ovaj nacin smo sigurni da necemo nikada imati sintaksnu gresku i možemo handleati situaciju u kojoj // instanca nije dostupna u kontejneru.}
Eto, ako uhvatim više vremena pisat ću vam još, možda neki konkretni tutorijal :)
Uživajte.
DI i DIC su dve razlicite stvari, ovdje si dao primjer za jedno a objasnio drugo
Sve u svemu, fino si slozio ovo i drago mi je sto se malo aktivirao podforum :)