Service providers: cargar componentes sin instanciar
Clase 25 de 33 • Curso Avanzado de Laravel
Contenido del curso
Entorno de trabajo y repaso de Laravel
Manejo de tu base de datos con Laravel
La terminal de Laravel
Eventos y tareas de Laravel
Manejo de errores
El corazón de Laravel
Creación de paquetes
- 26

Cómo crear paquetes Laravel con Composer
08:51 min - 27
Propiedades para manejo de dependencias
02:02 min - 28
Comprende el archivo composer.json
02:23 min - 29

Cómo Composer carga clases automáticamente
04:18 min - 30

Crear mis propios Services Providers
08:58 min - 31

Cómo publicar archivos con Service Provider
04:12 min - 32

Instalando paquetes desde GitHub con Composer
10:35 min - 33

Publicar tu paquete PHP en Packages
03:12 min
Domina los conceptos clave del núcleo de Laravel con un enfoque práctico y claro. Aquí verás cómo los service providers cargan clases esenciales, cómo se integran con el service container y cómo usar un view composer para compartir datos con vistas sin instanciar manualmente componentes.
¿Qué son los service providers y cómo operan en Laravel?
Los service providers viven en la carpeta providers y son la puerta de entrada para cargar servicios y clases esenciales. Ya has trabajado con AppServiceProvider, donde se registran los gates de políticas y que extiende de la clase base ServiceProvider.
- Están compuestos por dos métodos: register y boot.
- register: registra clases o servicios en el container. No ejecuta lógica que dependa de servicios ya registrados.
- boot: se ejecuta después de registrar todos los service providers. Ideal para inicializar comportamientos que dependen de otros servicios.
- Secuencia de carga: se levanta la aplicación, se registran todos los service providers y luego se llama a boot de cada uno.
- Beneficio clave: inicializar una clase o componente sin instanciarlo de antemano.
- Conexión con el núcleo: el flujo de la petición se comunica con los service providers y estos operan respaldados por el service container.
¿Cómo crear y registrar un provider con php artisan?
Para extender funcionalidades de Laravel o integrar un paquete de terceros, puedes generar un provider con el comando de consola. El archivo se crea dentro de providers.
php artisan make:provider RatingProvider
Regístralo en el arreglo providers del archivo de configuración:
// config/app.php
'providers' => [
// ...
App\Providers\RatingProvider::class,
];
Puntos clave que desarrollas como habilidad práctica: - Uso de php artisan make:provider para scaffolding del provider. - Registro manual en config/app para habilitarlo en la aplicación. - Comprensión de los métodos register y boot y cuándo usar cada uno.
¿Cómo compartir datos con un view composer desde boot?
Un caso útil: compartir datos con una vista específica mediante un view composer definido en boot. Primero, puedes verificar la ejecución con un dd(true) y luego reemplazarlo por la lógica real.
Ejemplo dentro de tu provider:
use Illuminate\Support\Facades\View;
// ...
public function boot(): void
{
View::composer('home', function ($view) {
// Prueba inicial.
// dd(true);
// Compartir datos reales con la vista 'home'.
$view->with('rating', RatingResource::collection(Rating::all()));
});
}
Detalles y conceptos que aplicas: - helper view y método composer para enlazar lógica a una vista en particular. - Variable compartida: rating. - Fuente de datos: Rating Resource con collection sobre all para enviar todos los registros como recurso.
En la vista home, itera la colección con foreach para mostrar los datos necesarios, como rateable->name y score:
<ul>
@foreach($rating as $r)
<li>{{ $r->rateable->name }} — {{ $r->score }}</li>
@endforeach
</ul>
Con este patrón, consigues: - Inyección automática de datos en vistas sin duplicar lógica. - Separación limpia entre obtención de datos y renderizado. - Flujo alineado al ciclo de vida: el composer corre tras el registro de servicios, dentro de boot.
¿Tienes dudas, casos de uso o quieres compartir cómo integraste service providers y view composers en tu proyecto? Deja tus comentarios y continuemos la conversación.