Comparación de Métodos de Vinculación de Objetos en el Contenedor de Servicios de Laravel
| Método | bind() |
singleton() |
scoped() |
instance() |
|---|---|---|---|---|
| Descripción | Crea una nueva instancia cada vez que se resuelve. | Crea solo una instancia y devuelve la misma instancia en solicitudes posteriores. | Crea solo una instancia dentro de cada ciclo de vida de solicitud/trabajo; se borra después de que finaliza la solicitud. | Vincula una instancia existente al contenedor y devuelve esa instancia cada vez que se resuelve. |
| Pros | - Una instancia nueva para cada solicitud, sin problemas de estado compartido - Uso de memoria limpio - Adecuado para lógica que requiere estado independiente - Puede proporcionar una configuración única para cada solicitud |
- Ahorra recursos del sistema creando una instancia solo una vez - Garantiza la consistencia del estado - Adecuado para compartir configuración y recursos - Mejor rendimiento en situaciones de alta concurrencia |
- Equilibra el uso de memoria y el estado compartido - Comparte el estado dentro de una solicitud pero aislado entre solicitudes - Adecuado para escenarios de solicitud web |
- Control total sobre el momento de creación de la instancia - Puede preconfigurar el estado de la instancia - Adecuado para servicios que requieren una configuración específica |
| Contras | - Requiere más recursos del sistema para crear instancias repetidamente - Puede afectar el rendimiento bajo alta concurrencia - No apto para escenarios que requieren estado compartido - Puede causar problemas de rendimiento porque se crea una nueva instancia cada vez. |
- El estado compartido puede llevar a errores difíciles de rastrear - No apto para escenarios que requieren estado independiente - El uso de memoria persiste hasta que finaliza el programa - Las pruebas requieren atención especial al restablecimiento del estado - Si la instancia mantiene estado, puede causar un comportamiento inesperado. |
- Puede causar problemas en tareas de larga duración - Requiere comprender el ciclo de vida de la solicitud - No apto para comandos CLI |
- Menos flexible - No se puede ajustar dinámicamente la configuración de la instancia - Puede ocupar memoria al inicio - No apto para casos que requieren carga diferida o múltiples instancias. |
| Caso de Uso | Para servicios de corta duración o clases que requieren estado independiente. | Para servicios compartidos globalmente, como loggers o gestores de configuración. | Para servicios que necesitan mantener el estado dentro de una solicitud pero no entre solicitudes, como conexiones de base de datos. | Cuando ya tienes una instancia y quieres reutilizarla, como un objeto de configuración compartido. |
| Ejemplo | Cuando tienes una clase Product y quieres crear una nueva instancia de Product cada vez que se solicitan diferentes datos de producto. |
Cuando tienes una clase Logger y quieres que todas las operaciones de escritura de logs utilicen la misma instancia para mantener la consistencia. |
Cuando tienes una clase ShoppingCart y necesitas compartir el estado del carrito de compras dentro de la misma solicitud. |
Cuando tienes una clase DatabaseConfig y necesitas establecer parámetros de conexión cuando se inicia la aplicación. |
Ejemplos
Usando bind()
$this->app->bind('Product', function () {
return new Product();
});
Cada vez que se llama a app('Product'), devuelve una nueva instancia de Product.
Usando singleton()
$this->app->singleton('Logger', function () {
return new Logger();
});
Cada vez que se llama a app('Logger'), devuelve la misma instancia de Logger.
Usando scoped()
$this->app->scoped(Transistor::class, function (Application $app) {
return new Transistor($app->make(PodcastParser::class));
});
Comparte la misma instancia dentro del mismo ciclo de vida de solicitud; diferentes solicitudes crearán nuevas instancias.
Usando instance()
$service = new Transistor(new PodcastParser);
$this->app->instance(Transistor::class, $service);
Vincula directamente una instancia existente al contenedor.
Resumen
Laravel actualmente se puede aplicar en muchos tipos diferentes de escenarios, como Solicitudes Web, Comandos CLI, Trabajos de Cola, Comandos de Consola, etc.
Por lo tanto, al elegir qué método de vinculación usar, debes considerar las necesidades del servicio en diferentes escenarios y si necesitas compartir estado o configuración.