Service providers: cargar componentes sin instanciar

Clase 25 de 33Curso Avanzado de Laravel

Resumen

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.