Qué es Manager
Illuminate\Support\Manager es una clase abstracta presente en Laravel desde la versión 4.0. Proporciona la base para construir con facilidad sistemas donde puedes alternar entre varios “drivers”, como caché, sesión o correo.
Por «driver» entendemos backends que comparten una misma interfaz pero cuya implementación interna difiere. Por ejemplo, en sesiones existen file, cookie, database y redis, y se cambian mediante la clave driver del archivo de configuración.
Uso dentro del framework
No todas las clases con nombreManager extienden Illuminate\Support\Manager.
Aun así, las clases que no lo heredan comparten la idea básica de extenderse con
extend(). Entender el patrón Manager te ayudará a comprender cómo funciona el framework en general.
Funcionamiento básico
driver() — obtener un driver
Cuando llamas adriver(), se resuelve siguiendo estos pasos:
Si miras el código fuente, verás que el nombre del método se construye a partir del nombre del driver con Str::studly().
file invoca createFileDriver() y el driver my-custom invoca createMyCustomDriver().
extend() — registrar un driver personalizado
Pasando el nombre del driver y una closure aextend(), puedes registrar tu propio driver. El argumento de la closure es la instancia del contenedor.
extend() hace un bind del closure a $this, así que dentro puedes acceder a las propiedades y métodos del Manager.
__call — delegación al driver por defecto
La clase Manager implementa__call, así que cualquier llamada a un método que no exista en el propio Manager se delega automáticamente al driver por defecto.
SessionManager::get('key'): usas directamente el Manager, pero el trabajo real lo hace el driver.
Ejemplo con SessionManager
Si mirasIlluminate\Session\SessionManager, verás claramente cómo se usa Manager.
Usar Manager en tu paquete
Implementación básica
Como ejemplo, creemos una clase de servicio de notificaciones que extiendeManager.
1
Crear una clase que extienda Manager
2
Registrar en un service provider
3
Añadir un driver personalizado
4
Usarlo
MultipleInstanceManager
Illuminate\Support\MultipleInstanceManager es una clase añadida en Laravel 10. Mientras que Manager gestiona «tipos» de driver, MultipleInstanceManager gestiona varias «instancias» con nombre.
Diferencias respecto a Manager
Métodos obligatorios
Al extenderMultipleInstanceManager, debes implementar tres métodos.
getInstanceConfig() devuelve el array de configuración correspondiente al nombre. La configuración debe contener siempre la clave driver (o la clave que hayas especificado con $driverKey).
Flujo de resolución
Ejemplo en un paquete propio
Como ejemplo, un paquete que soporta varias gateways SMS a la vez.instance().
Gestión de la caché de drivers
Operaciones de caché en Manager
Operaciones de caché en MultipleInstanceManager
Resumen
Managergestiona «tipos» de driver. Implementa los métodoscreateXxxDriver()y extiende conextend().MultipleInstanceManagergestiona «instancias» de drivers por nombre. Es adecuado para paquetes que necesitan varias configuraciones de conexión.- No todas las clases con nombre
ManagerextiendenIlluminate\Support\Manager.CacheManageryQueueManagertienen implementaciones propias.
Trait Macroable
Aprende cómo usar el trait Macroable para añadir métodos propios a clases existentes.