Jedna z najczęściej powtarzanych opinii, dlaczego Symfony jest lepszym frameworkiem niz Laravel jest system container service czy chociażby auto wire’ing na config'ach tego pierwszego. Ale Laravel nie larwa w końcu... tez ma swój ;)

 

Przyznać trzeba racje, ze service container w Laravelu jest - przynajmniej w dokumentacji - mniej wygodny i niż ten znany z Symfony. Choć ja go lubię, a w Symfony auto wireing rożnych serviców potrafi przysporzyć problemów.

 

Nie należę do najleniwszych ludzi na świecie (choć wedle powszechnej opinii programiści tacy są -ba! Wręcz powinni być! ) i dodanie paru dodatkowych linijek na service providerze nie jest dla mnie szczególnym problemem. Choć te przyklady z dokumentacji nie oddają wszystkiego - i nie tylko w tej kwestii. Mała dygresja: Tak, dokumentacja jest ładna, szybko można się z nią zapoznać, jednak kopanie głębsze dla poznania bardziej wyrafinowanych meandrów wymaga zdecydowanie większych chęci i samozaparcia.

 

Na szczęście można pominąć mozolne tworzenie kolejnych linii kodu na metodzie register w service providerach - można zdefiniować na takowym odpowiednie pole klasy i tam w najzwyklejszym arrayu podawać co do czego ma być zbindowane. Najczęściej to wystarcza w zupełności. Choć i to rozwiązanie nie jest jakoś szczególnie eleganckie. Można je co prawda trochę ulepszyć, przenosząc te informacje na jakiś config (naturalnym miejscem do takich machinacji wydaje się config/app.php) tam dodając odpowiedni key z bindowanymi service’ami.

 

No tak, tak - powiecie - ale ciągle trzeba coś robić: dodawać ręcznie.. XXI wiek w końcu mamy! Spokojnie.. Jak na wstępie wspomniałem - larwa tez ma swój (auto bind’ing). Nie jest to jakoś szczególnie świeże odkrycie - ale istnieje paczka dodająca takową funkcjonalność.. i jak zdecydowana większość rzeczy w Laravel’u - emanuje sympatyczna prostota ;)

 

AutoBinder::from(folder: 'Services')
    ->as('singleton')
    ->bind();

=
    
$this->app->singleton(AuthServiceInterface::class, AuthService::class);
$this->app->singleton(UserServiceInterface::class, UserService::class);
$this->app->singleton(CompanyServiceInterface::class, CompanyService::class);
...

 

 

Opisywać jak jej użyć i jak działa nie ma raczej sensu - autor w dość prosty sposób opisał to w README swojej paczki. Jedna rzeczy mi się jednak nie podoba - z góry narzucone podejście, ze interfejsy trzymamy w wyszczególnionym, osobnym i odseparowanym namespace’ie (wiem, wiem można to zmienić - ale to trochę dodatkowej roboty - czytaj: kodu).

 

Wiem tez ze są rożne podejścia i metodologie, a każdy ma swoje poglądy na wygląd projektu i jego strukturę. Wiec w dysputę nie ma sensu wchodzić - gdzie programistów dwóch tam trzy podejścia - jak rzecze stare porzekadło w końcu ;). Niektórzy to nawet interfejsów nie lubią, mimo że podobno SOLID praktykują - choć to temat na inny artykuł (comming soon ?).

 

Słowem końca przyznam się nie chętnie - nie chcąc zostać zlinczowany - ze sam za taka automatyzacja nie przepadam za szczególnie. Dostosuje się, ale wole mieć mimo wszystko kontrole.. Nie ufam droidom, to jak mogę ufać auto bind’ingowi ? ;)

 

Dzięki za poświęcony czas - mam nadzieje, ze do następnego :)