bienes

Proveedores de Servicios en Laravel: qué son y cómo usar Proveedores de Servicios en Laravel

Los proveedores de servicios de Laravel son el lugar central donde se inicia la aplicación. Es decir, los servicios principales de laravel y los servicios de aplicación, las clases y sus dependencias se envían al contenedor de servicios a través de los proveedores. 

En otras palabras, los proveedores de servicios son como un embudo a través del cual vertemos combustible de "clase" en un tanque llamado "contenedor de servicio" de un motor llamado Laravel.

Ejemplo

Si abrimos config/app.php veremos un arreglo con el nombre “proveedor”

'providers' => [

        /*
        * Laravel Framework Service Providers...
        */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        .
        .
        .
],

Estos son algunos de los proveedores de servicios proporcionados junto con laravel, es decir, servicios básicos que se colocan en el contenedor de servicios.

Cuando yo service provider se realizan?

Si miramos la documentación bajo pedido ciclo de vida , los siguientes archivos se ejecutan al inicio:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php y su Middlewares
  • Service Providers: contenido de este artículo

Que service provider estan cargados? 

ellos son esos definoches en la matriz config/app.php:

return [
 
    // ... other configuration values
 
    'providers' => [
 
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
 
        // ... other framework providers from /vendor
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,
 
        /*
         * PUBLIC Service Providers - the ones we mentioned above
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
    ],
 
];

Como podemos ver, hay una lista de service provider no público en la carpeta /vendor, no debemos tocarlos ni modificarlos. Los que nos interesan están abajo, con BroadcastServicerProvider deshabilitado por defecto, probablemente porque rara vez se usa.

Todos estos proveedores de servicios van de arriba a abajo, repitiendo la lista dos veces:

  • La primera iteración está buscando un método opcional. register(), útil para (eventualmente) ejecutar algo configurado antes del método boot().
  • la segunda iteración ejecuta el método boot() de todos los proveedores. Nuevamente, uno por uno, de arriba a abajo, de la matriz 'providers'.
  • Finalmente, después de que se hayan procesado todos los proveedores de servicios, Laravel pasa a analizar la ruta (ruta), ejecutar el controlador, usar plantillas, etc.

Proveedores de servicios Laravel predefiniti

I Service Providers incluidos en Laravel, son todos los presentes en la carpeta app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Son todas clases de PHP, cada una relacionada con su propio tema: App, Auth, Broadcasting, Events e Routes. Pero todos tienen una cosa en común: método boot().

Dentro de ese método, podemos escribir cualquier código relacionado con cualquiera de esas secciones: auth, events, route, etc. En otras palabras, los proveedores de servicios son solo clases para registrar alguna funcionalidad global.

Están separados como "proveedores" porque se ejecutan muy temprano en el ciclo de vida de la aplicación, por lo que algo global es conveniente aquí antes de que el script de ejecución llegue a Modelos o Controladores.

La mayor parte de la funcionalidad está en RouteServiceProvider, aquí está el código:

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';
 
    public function boot()
    {
        $this->configureRateLimiting();
 
        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });
    }
 
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });
    }
}

Esta es la clase donde se configuran los archivos. route, con routes/web.phproutes/api.php incluido por defectodefinita. Tenga en cuenta que para la API también hay diferentes configuraciones: Prefijo de punto final /api y software intermedio api para todos routes.

Podemos editar el service providers, que no están en la carpeta /vendor. La personalización de estos archivos se realiza cuando tiene muchas rutas y desea separarlas en archivos específicos. Tu creas routes/auth.php y coloque las rutas allí, luego "habilita" ese archivo en el método boot() di RouteServiceProvider, solo agregue la tercera oración:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider esta vacio. Un ejemplo típico de agregar código AppServiceProvider, se trata de deshabilitar la carga diferida en Eloquent . Para hacer esto, solo necesitas añadir dos líneas en el método boot():

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Esto arrojará una excepción si no se carga un modelo de relación.

Crea tu propia service provider costumbre

Además de los archivos previosdefinoches, podemos crear uno nuevo fácilmente Service Provider, relacionados con otros temas distintos a los predefiterminado como auth/event/routes.

Un ejemplo bastante típico es la configuración de vista Blade. Podemos crear una directiva Bladey luego agregue ese código en el método boot() de cualquier service provider, incluido el valor predeterminado AppServiceProvider. Ahora vamos a crear un ViewServiceProvider separado.

Podemos generarlo con este comando:

php artisan make:provider ViewServiceProvider

Lo que generará la clase tan pre.definoche:

namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
 
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Como podemos ver en el interior hay dos métodos:

El método de registro()

El método register() nos permite defiFinalice los enlaces a nuestro contenedor de servicios. Por ejemplo, en el siguiente código:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app es una variable global en laravel a la que una clase singleton puede acceder a través de la aplicación.

Singleton es una característica. Al aplicar esta función, le informamos a la aplicación que cualquier clase que se pase como parámetro en la aplicación solo debe tener una instancia en toda la aplicación. Esto significa que MyClass se resolverá una vez y tendrá solo una instancia, a la que se puede acceder mediante la variable my_class.

El método de arranque()

El método boot() le permite acceder a todos los servicios previamente registrados utilizando el método de registro. Luego puede incluir todo el servicio en su aplicación usando este método.

Volviendo al ejemplo anterior, eliminemos el método register() y dentro boot() agregue el código de la directiva Blade:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Otro ejemplo de ViewServiceProvider saludos View Composers, aquí está el fragmento del sitio oficial de Laravel :

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
 
class ViewServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // Using class based composers...
        View::composer('profile', ProfileComposer::class);
 
        // Using closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}

Para ejecutar, este nuevo proveedor debe agregarse/registrarse en la matriz de proveedores config/app.php:

return [
    // ... other configuration values
 
    'providers' => [
 
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
 
        // Add your provider here
        App\Providers\ViewServiceProvider::class,
    ],
];

Ercole Palmeri

También podrían estar interesados ​​en:

Boletín de innovación
No te pierdas las noticias más importantes sobre innovación. Regístrese para recibirlos por correo electrónico.

Artículos recientes

Editores y OpenAI firman acuerdos para regular el flujo de información procesada por la Inteligencia Artificial

El lunes pasado, el Financial Times anunció un acuerdo con OpenAI. FT otorga licencia para su periodismo de clase mundial...

Abril 30 2024

Pagos en línea: así es como los servicios de transmisión le hacen pagar para siempre

Millones de personas pagan por servicios de streaming pagando cuotas de suscripción mensuales. Es opinión común que usted…

Abril 29 2024

Veeam ofrece el soporte más completo para ransomware, desde protección hasta respuesta y recuperación.

Coveware by Veeam seguirá brindando servicios de respuesta a incidentes de extorsión cibernética. Coveware ofrecerá capacidades forenses y de remediación...

Abril 23 2024

Revolución verde y digital: cómo el mantenimiento predictivo está transformando la industria del petróleo y el gas

El mantenimiento predictivo está revolucionando el sector del petróleo y el gas, con un enfoque innovador y proactivo para la gestión de plantas.…

Abril 22 2024