El Service Container (contenedor de servicios) gestiona automáticamente la creación y la inyección de dependencias de clases.

Antes de que puedas utilizar una clase desde cualquier lugar de tu aplicación, necesitas registrarla en el contenedor. Esto se hace generalmente a través de Service Providers (proveedores de servicios).

Gracias a la inyección automática de dependencias y las facades, NO todas las clases necesitan ser registradas en él contenedor.

El contenedor puede resolver automáticamente dependencias de:

  1. Controladores
  2. Detectores de eventos
  3. Middleware
  4. Trabajos en cola
  • El contenedor implementa la interfaz PSR-11

Service Providers

Los proveedores son el lugar central para configurar la lógica de contenedores:

  • Se configuran en config/app.php y se almacenan en el app/Providers.
  • Los proveedores se cargan durante el inicio de la aplicación,
  • Dentro de un proveedor, siempre tienes acceso al contenedor a través de la propiedad $this->app.
  • La mayoría de los proveedores contienen un método register y un boot.
  • Dentro del register, solo debes vincular cosas al contenedor usando el método bind,

Puedes:

  1. Vincular una interfaz a una implementación concreta (Vinculación), lo que permite que Laravel sepa qué implementación usar cuando se solicita la interfaz:
public function register()
{
    $this->app->bind(
        'App\Contracts\MailServiceInterface',
        'App\Services\SmtpMailService'
    );
}
  1. Definir alias para clases en config/app.php, lo que puede hacer que el acceso a ciertas clases sea más conveniente:

  2. Vincular una instancia existente de una clase al contenedor.

use App\Services\PodcastParser;

$service = new Transistor(new PodcastParser);

public function register()
{
   $this->app->instance(
      'App\Services\Transistor',
      $service
   );
}

Puedes utilizar:

  1. El método bindIf si aún no se ha registrado un enlace,
  2. El método singleton si necesitas que una clase tenga una sola instancia a lo largo de la vida de la solicitud
  3. El método singletonIf ....
  4. El método scoped; similar al singleton

Revisa el código fuente de Laravel y otros paquetes populares para ver cómo utilizan el contenedor.