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:
- Controladores
- Detectores de eventos
- Middleware
- 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 elapp/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 unboot
. - Dentro del
register
, solo debes vincular cosas al contenedor usando el métodobind
,
Puedes:
- 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'
);
}
-
Definir alias para clases en
config/app.php
, lo que puede hacer que el acceso a ciertas clases sea más conveniente: -
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:
- El método
bindIf
si aún no se ha registrado un enlace, - El método
singleton
si necesitas que una clase tenga una sola instancia a lo largo de la vida de la solicitud - El método
singletonIf
....> - El método
scoped
; similar alsingleton
Revisa el código fuente de Laravel y otros paquetes populares para ver cómo utilizan el contenedor.