IoC vsebnik pri Laravel


Čeprav se s spletnim ogrodjem v PHP-ju Laravel ukvarjam že kar nekaj časa, me še vedno preseneča njen IoC container (vsebnik inverzije nadzora, IoC vsebnik), ki zelo poenostavi upravljanje odvisnosti razredov. Poznavanje njegovega delovanja je ključ do razvoja dobrih aplikacij z Laravel. IoC vsebnik nam pomaga, da je naša koda lažje berljiva, vzdrževana in testirana.

Ideja IoC vsebnika je, da nam pri kreiranju objekta razreda, ki je odvisen od novih objektov drugih razredov, slednjih ni potrebno navajati. Odvisnosti morajo biti definirane v konstruktorju razreda, saj jih tako lahko z lahkoto zamenjamo in biti morajo poimenovane (type-hinting). Se pravi nekaj takega:

class Foo {
    public __construct(Bar $bar, Baz $baz) {
        $this->bar = $bar;
        $this->baz = $baz;
    }
}

Ob razreševanju razreda A, ki mu eksplicitno ne podamo odvisnost B, Laravel pogleda v konstruktor razreda A, vidi da je odvisen od razreda B (natančneje vidi njegov tip) ter sam ustvari nov objekt razreda B in ga vbrizgne ob kreiranju razreda A. Preko IoC vsebnika razrešujemo razred na sledeč način:

App::make('Foo');

A to ni edina naloga IoC vsebnika!

Zame druga najbolj uporabna stvar IoC vsebnika je vezanje implementacije k vmesniku (interface). Recimo, da imamo nek razred, ki je odvisen od vmesnika (ko uporabljamo vmesnik, nas ne zanima, kateri implementirani razred uporabljamo, ampak samo da ima ta razred implementirane metode vmesnika). Ko IoC vsebnik razrešuje tak razred, bo vmesnik avtomatsko zamenjal z njegovo implementacijo, ki smo jo definirali malo prej.

App::bind('UserRepositoryInterface', 'DbUserRepository');

IoC vmesnik lahko uporabljamo še za vodnike (handlers), kjer je potrebno samo podati razred, ki naj se izvede kot aktiviramo lastnost.

Route::filter('foo', 'FooFilter');
View::composer('foo', 'FooComposer');
Event::listen('foo', 'FooHandler');