Pacuna's Blog

Utilizando el IoC Container de Laravel

El IoC container de Laravel es una poderosa herramienta que nos puede ayudar a manejar las dependencias en nuestras clases a través de inyecciones. A continuación mostraré un ejemplo simple.

Supongamos que tenemos el siguiente controlador, el cual hace uso de algún servicio

<?php
class SomeController extends BaseController{
  protected $someInterface;
  public function __construct(SomeInterface $someInterface)
   {
    $this->someInterface = $someInterface;
   }
  public function helloWorld()
  {
   return $this->someInterface->sayHello();
  }
}

Como podemos ver, este controlador recibe una interfaz en su constructor, la cual luego es utilizada en el método helloWorld. Cuando la clase SomeController es creada, se le debe entregar una instancia concreta de alguna clase que implemente esta interfaz. Laravel puede hacer esto de manera automática a través de su IoC container. Sólo debemos indicar cual es la clase que implementa esta interfaz. Esta metodología entrega una mayor flexibilidad ya que podemos intercambiar las implementaciones de manera más fácil.

Para crear la dependencia utilizamos el método bind(), de la Facade App en laravel. El primer parámetro es el nombre la interfaz que deseamos implementar, y luego podemos usar una función closure para indicar cual es la clase concreta que implementará.

Nota: el IoC container de Laravel tiene muchas más funcionalidades y no sirve sólo para asociar clases a interfaces

Supongamos que nuestra interfaz y la clase concreta que la implementa son de la siguiente manera:

interface SomeInterface{
  public function sayHello();
}

class Concrete implements SomeInterface{
 public function sayHello()
 {
 return 'hello world!';
 }
}

Luego podemos hacer el bind para agregar la dependencia en el contenedor:

App::bind('SomeInterface', function($app){
 return new Concrete();
});

Ahora Laravel sabe como crear nuestro controlador e inyectar la dependencia directamente. Puedes crear una ruta que llame a la acción sayHello() y verás que devuelve la implementación de la clase que está implementando la interfaz, que en nuestro caso es Concrete.

Route::get('/', '[email protected]');

Eso es todo! si tienes dudas o sugerencias deja un comentario.

View original

#php #laravel

- 1 toasts