[PHP OOP] Dependency injection

Započeo Slay, April 25, 2018, 00:00:25 PRE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

PHP Dependency Injection

UVOD

Evo 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.
Kristijan Stipić

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 :)

About

Welcome to the community!