Articles

Proveïdors de serveis a Laravel: què són i com utilitzar els proveïdors de serveis a Laravel

Els proveïdors de serveis Laravel són el lloc central on s'inicia l'aplicació. És a dir, els serveis bàsics de Laravel i els serveis d'aplicacions, les classes i les seves dependències es col·loquen al contenidor de serveis mitjançant proveïdors. 

En altres paraules, els proveïdors de serveis són com un embut a través del qual aboquem combustible "de classe" en un dipòsit anomenat "contenidor de servei" d'un motor anomenat Laravel.

exemple

Si obrim config/app.php veurem una matriu amb el nom "proveïdor"

'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,
        .
        .
        .
],

Aquests són alguns dels proveïdors de serveis que ofereixen juntament amb laravel, és a dir, serveis bàsics que es col·loquen al contenidor del servei.

Quan jo service provider es fan?

Si mirem la documentació cicle de vida a petició , els fitxers següents s'executen a l'inici:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php i la seva Middlewares
  • Service Providers: contingut d'aquest article

Què service provider estan carregats? 

Són aquells definits a la matriu 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,
 
    ],
 
];

Com podem veure, hi ha una llista service provider no és públic a la carpeta /vendor, no els hem de tocar ni modificar. Els que ens interessen estan a continuació, amb BroadcastServicerProvider desactivat per defecte, probablement perquè s'utilitza poques vegades.

Tots aquests proveïdors de serveis funcionen de dalt a baix, repetint la llista dues vegades:

  • La primera iteració busca un mètode opcional register(), útil per (eventualment) executar alguna cosa configurada abans del mètode boot().
  • la segona iteració executa el mètode boot() de tots els proveïdors. De nou, un per un, de dalt a baix, de la matriu 'providers'.
  • Finalment, després de processar tots els proveïdors de serveis, Laravel passa a analitzar el camí (ruta), executar el controlador, utilitzar plantilles, etc.

Proveïdors de serveis Laravel predefiniti

I Service Providers inclosos a Laravel, són tots els presents a la carpeta app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Totes són classes PHP, cadascuna relacionada amb el seu propi tema: App, Auth, Broadcasting, Events e Routes. Però tots tenen una cosa en comú: el mètode boot().

Dins d'aquest mètode, podem escriure qualsevol codi relacionat amb qualsevol d'aquestes seccions: auth, events, route, etc. En altres paraules, els proveïdors de serveis són només classes per registrar alguna funcionalitat global.

Estan separats com a "proveïdors" perquè s'executen molt aviat en el cicle de vida de l'aplicació, de manera que alguna cosa global és convenient aquí abans que l'script d'execució arribi a Models o Controllers.

La major part de la funcionalitat es troba a RouteServiceProvider, aquí teniu el codi:

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());
        });
    }
}

Aquesta és la classe on es configuren els fitxers route, Amb routes/web.phproutes/api.php inclòs per defectedefinita. Tingueu en compte que per a l'API també hi ha diferents configuracions: Prefix del punt final /api i middleware api per a tot routes.

Podem editar el service providers, que no es troben a la carpeta /vendor. La personalització d'aquests fitxers es fa quan teniu molts camins i voleu separar-los en fitxers específics. Tu crees routes/auth.php i poseu-hi els camins i, a continuació, "activeu" aquest fitxer al mètode boot() di RouteServiceProvider, només cal afegir la tercera frase:

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

AppServiceProvider està buit. Un exemple típic d'afegir codi AppServiceProvider, tracta de desactivar la càrrega mandrosa a Eloquent . Per fer-ho, només cal afegir dues línies en el mètode boot():

Butlletí d'innovació
No et perdis les notícies més importants sobre innovació. Registra't per rebre'ls per correu electrònic.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Això generarà una excepció si no es carrega un model de relació.

Crea el teu propi service provider personalitzat

A més dels fitxers predefinits, podem crear-ne de nou fàcilment Service Provider, relacionats amb altres temes diferents dels predefiacabat com auth/event/routes.

Un exemple bastant típic és la configuració de la vista Blade. Podem crear una directiva Blade, i després afegiu aquest codi al mètode boot() de qualsevol service provider, inclosa la predeterminada AppServiceProvider. Ara creem un ViewServiceProvider separat.

El podem generar amb aquesta comanda:

php artisan make:provider ViewServiceProvider

El que generarà la classe tan predefinit:

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()
    {
        //
    }
}

Com podem veure a l'interior hi ha dos mètodes:

El mètode register().

El mètode register() ens permet defienllaços acabats al nostre contenidor de servei. Per exemple, en el codi següent:

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

$this->app és una variable global a laravel a la qual una classe singleton pot accedir a través de l'aplicació.

Singleton és una característica. Quan apliquem aquesta característica, estem informant a l'aplicació que qualsevol classe que es passi com a paràmetre a l'aplicació només hauria de tenir una instància a tota l'aplicació. Això vol dir que MyClass es resoldrà una vegada i només tindrà una instància, a la qual es pot accedir mitjançant la variable my_class.

El mètode boot().

El mètode boot() us permet accedir a tots els serveis registrats prèviament mitjançant el mètode register. A continuació, podeu incloure tot el servei a la vostra aplicació mitjançant aquest mètode.

Tornant a l'exemple anterior, eliminem el mètode register() i dins boot() afegiu el codi de 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'); ?>";
    });
}

Un altre exemple de ViewServiceProvider es refereix View Composers, aquí teniu el fragment del lloc 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) {
            //
        });
    }
}

Per executar-se, aquest nou proveïdor s'ha d'afegir/registrar a la matriu de proveïdors 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

També us pot interessar:

Butlletí d'innovació
No et perdis les notícies més importants sobre innovació. Registra't per rebre'ls per correu electrònic.

Articles recents

El futur és aquí: com la indústria naviliera està revolucionant l'economia global

El sector naval és una veritable potència econòmica mundial, que ha navegat cap a un mercat de 150 milions...

1 maig 2024

Els editors i OpenAI signen acords per regular el flux d'informació processada per la Intel·ligència Artificial

Dilluns passat, el Financial Times va anunciar un acord amb OpenAI. FT autoritza el seu periodisme de classe mundial...

30 2024 abril

Pagaments en línia: aquí teniu com els serveis de streaming us fan pagar per sempre

Milions de persones paguen per serveis de streaming, pagant quotes de subscripció mensuals. És l'opinió comuna que tu...

29 2024 abril

Veeam ofereix el suport més complet per a ransomware, des de la protecció fins a la resposta i la recuperació

Coveware de Veeam continuarà oferint serveis de resposta a incidents d'extorsió cibernètica. Coveware oferirà capacitats forenses i de reparació...

23 2024 abril