Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IoC container beyond constructor injection - PHP & Laravel Eindhoven

IoC container beyond constructor injection - PHP & Laravel Eindhoven

Did you know your IoC container can do a whole lot more than just constructor injection? Besides that it is actually packed with features. Inflectors, resolving callbacks, aliasing, method invocation to name a few. In this talk you will learn how to leverage the power of a great container and service providers to write better, loosely coupled code. Well designed code put together by your IoC container will make your applications SOLID, modular, lean and decoupled from the framework!

Feedback here: http://www.meetup.com/Laravel-Eindhoven/events/231269730/

Hannes Van De Vreken

July 27, 2016
Tweet

More Decks by Hannes Van De Vreken

Other Decks in Technology

Transcript

  1. !

  2. WHAT IS IOC? class Service { public function __construct(Ftp $ftp)

    { } public function calculate() { // Get stuff from FTP. // Do calculations. // Return result. } }
  3. WHAT IS IOC? class Service { public function __construct(Ftp $ftp)

    { } public function calculate() { // Get stuff from FTP. // Add caching to prevent hitting FTP over and over again // Do calculations. // Return result. } }
  4. WHAT IS IOC? class Service { public function __construct(Ftp $ftp)

    { } public function calculate() { // Get stuff from FTP. // Add caching to prevent hitting FTP over and over again // Log that FTP is accessed. // Do calculations. // Return result. } }
  5. WHAT IS IOC? class Service { public function __construct(Ftp $ftp)

    { } public function calculate() { // Get stuff from FTP. // Add caching to prevent hitting FTP over and over again // Log that FTP is accessed. // Do calculations. // Return result. } }
  6. WHAT IS IOC? \ class FtpStorage { public function __construct(Ftp

    $ftp) { $this->ftp = $ftp; } public function get($key) { // Get it. // Cache it. // Log it. } }
  7. WHAT IS IOC? \ class FtpStorage implements Storage { public

    function __construct(Ftp $ftp) { $this->ftp = $ftp; } public function get($key) { … } }
  8. WHAT IS IOC? \ class CacheDecorator implements Storage { public

    function __construct(Cache $cache, Storage $storage) {…} public function store($key, $value) { return $this->cache->remember($key, 60, function () { return $this->storage->get($key); }); } }
  9. WHAT IS IOC? \ class LogDecorator implements Storage { public

    function __construct(LoggerInterface $log, Storage $sto {…} public function store($key, $value) { $this->log->info('Retrieved value for '.$key); return $this->storage->get($key); } }
  10. WHAT IS IOC? \ class FtpStorage implements Storage { public

    function __construct(Ftp $ftp) { $this->ftp = $ftp; } public function get($key) { // Get it and return it. } }
  11. WHAT IS IOC? $container->get(Service::class); 1) Make FtpStorage 2) Wrap it

    with LogDecorator 3) Wrap LogDecorator instance with CacheDecorator 4) New up Service with CacheDecorator instance.
  12. WHAT IS IOC? Dependency injection: Injecting `Storage` into `Service` Dependency

    inversion: Interface + implementation Inversion of Control: The container builds our objects trough composition
  13. class SendInvoice { public function __construct(Mailer $mailer) { $this->mailer =

    $mailer; } public function listen(InvoiceGeneratedEvent $event) { … } }
  14. class ServiceProvider { protected $defer = true; public function register()

    {…} public function provides() { return [ Mailer::class, SwiftMailer::class, ]; } }
  15. trait EnvironmentAware { public function setEnv($env) { $this->env = $env;

    } private function isEnv($envs): bool { return in_array($this->env, (array) $envs); } }
  16. REGISTRATION - CONTAINER EVENTS Also useful for: - Quickly injecting

    stuff - Injecting soft dependencies - Setting configurable values
  17. BONUS - CIRCULAR DEPENDENCIES $mailer = new Mailer(); $queue =

    new Queue(MailerInterface $mailer); $mailer->setQueueResolver(function () { return $this->app->make('queue'); });