articuli

Fornitori di serviziu in Laravel: ciò chì sò è cumu utilizà Fornitori di serviziu in Laravel

I fornituri di servizii Laravel sò u locu centrale induve l'applicazione hè iniziata. Vale à dì, i servizii core di Laravel è i servizii di l'applicazione, e classi, è e so dipendenze sò posti in u containeru di serviziu per via di i fornituri. 

In altri palori, i fornituri di serviziu sò cum'è un funnel à traversu quale avemu versatu carburante "classe" in un tank chjamatu "container di serviziu" di un mutore chjamatu Laravel.

esempiu

Se apremu config/app.php, videremu un array cù u nome "provider"

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

Eccu alcuni di i fornituri di servizii furniti inseme cù laravel, vale à dì i servizii basi chì sò posti in u containeru di serviziu.

Quandu i service provider sò fatti ?

Se guardemu a documentazione nantu à u ciclu di vita di a dumanda , i seguenti schedari sò eseguiti à u principiu:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php è u so Middlewares
  • Service Providers: cuntenutu di stu articulu

Chì service provider sò carchi ? 

Sò quelli definite in l'array 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,
 
    ],
 
];

Comu pudemu vede, ci hè una lista di service provider micca publicu in u cartulare /vendor, ùn duvemu nè tuccalli nè mudificà. Quelli chì ci interessanu sò sottu, cù BroadcastServicerProvider disattivatu per difettu, probabilmente perchè hè raramente utilizatu.

Tutti issi fornituri di serviziu currenu da cima à fondu, ripetendu a lista duie volte:

  • A prima iterazione cerca un metudu opcional register(), utile per (eventualmente) esecutà qualcosa cunfigurata prima di u metudu boot().
  • a seconda iterazione eseguisce u metudu boot() di tutti i fornitori. Di novu, unu per unu, da cima à fondu, di u array 'providers'.
  • Infine, dopu chì tutti i fornituri di serviziu sò stati processati, Laravel passa à analizà u percorsu (route), eseguisce u controller, utilizendu mudelli, etc.

Prestatori di serviziu Laravel predefiniti

I Service Providers inclusi in Laravel, sò tutti quelli prisenti in u cartulare app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Sò tutti classi PHP, ognunu ligatu à u so propiu tema: App, Auth, Broadcasting, Events e Routes. Ma tutti anu una cosa in cumunu: u metudu boot().

Dentru stu metudu, pudemu scrive qualsiasi codice in relazione à qualsiasi di queste sezioni: auth, events, route, etc. In altre parolle, i Fornitori di serviziu sò solu classi per registrà alcune funziunalità glubale.

Sò separati cum'è "prestatori" perchè scorri assai prima in u ciclu di vita di l'applicazione, cusì qualcosa globale hè cunvene quì prima chì u script di esecuzione arrivi à Modelli o Controllers.

A maiò parte di e funziunalità hè in RouteServiceProvider, quì hè u codice:

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

Questa hè a classa induve i schedari sò cunfigurati route, cun routes/web.phproutes/api.php inclusu per difettudefinita. Nota chì per l'API ci sò ancu diverse cunfigurazioni: Prefissu endpoint /api è middleware api per tutti routes.

Pudemu edità u service providers, chì ùn sò micca in u cartulare /vendor. A persunalizazione di sti schedari hè fatta quandu avete parechje strade è vulete separà in schedarii specifichi. Tu crea routes/auth.php è mette i chjassi, allora "attivate" u schedariu in u metudu boot() di RouteServiceProvider, basta aghjunghje a terza frase:

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

AppServiceProvider hè viotu. Un esempiu tipicu di aghjunghje codice AppServiceProvider, si tratta di disattivà a carica lazy in Eloquent . Per fà questu, avete solu bisognu aghjunghje dui linii in u metudu boot():

Newsletter di l'innovazione
Ùn mancate micca e nutizie più impurtanti nantu à l'innuvazione. Iscriviti per riceveli per email.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Questu hà da scaccià una eccezzioni se un mudellu di relazione ùn hè micca caricatu.

Crea u vostru propiu service provider persunalizata

In più di i schedari predefinite, pudemu creà facilmente un novu Service Provider, liate à altri temi chè quelli predefifinitu cum'è auth/event/routes.

Un esempiu abbastanza tipicu hè a cunfigurazione di vista Blade. Pudemu creà una direttiva Blade, è dopu aghjunghje stu codice in u metudu boot() di qualcunu service provider, cumpresu u default AppServiceProvider. Ora criemu un ViewServiceProvider separatu.

Pudemu generà cù questu cumandamentu:

php artisan make:provider ViewServiceProvider

Chì generà a classa cusì predefinotte:

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

Comu pudemu vede à l'internu, ci sò dui metudi:

U metudu register().

U metudu register() ci permette defiligami finiti à u nostru containeru di serviziu. Per esempiu, in u codice seguente:

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

$this->app hè una variabile globale in laravel chì una classa singleton pò accede à traversu l'app.

Singleton hè una caratteristica. Quandu applicà sta funzione, informemu à l'applicazione chì qualunque classa hè passata cum'è paràmetru in l'app deve avè solu una istanza in tutta l'applicazione. Questu significa chì MyClass serà risolta una volta è avarà una sola istanza, chì pò esse accede cù a variabile my_class.

U metudu boot().

U metudu boot() permette di accede à tutti i servizii registrati prima cù u metudu di registru. Pudete tandu include tuttu u serviziu in a vostra applicazione cù stu metudu.

Riturnendu à l'esempiu precedente, sguassemu u metudu register() è dentru boot() aghjunghje u codice di direttiva 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 altru esempiu di ViewServiceProvider riguardu View Composers, eccu u snippet da u situ ufficiale di 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 eseguisce, stu novu fornitore deve esse aghjuntu / arregistratu à l'array in provider 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

Pudete ancu esse interessatu in:

Newsletter di l'innovazione
Ùn mancate micca e nutizie più impurtanti nantu à l'innuvazione. Iscriviti per riceveli per email.

Articuli recenti

I benefici di e pagine di culore per i zitelli - un mondu di magia per tutte l'età

Sviluppà e cumpetenze di u mutore fine attraversu u culore prepara i zitelli per e cumpetenze più cumplesse cum'è a scrittura. Per culori…

2 May 2024

U futuru hè quì: cumu l'industria di a spedizione rivoluziona l'economia glubale

U settore navale hè un veru putere ecunomicu glubale, chì hà navigatu versu un mercatu di 150 miliardi ...

1 May 2024

L'editori è l'OpenAI firmanu accordi per regulà u flussu di l'infurmazioni trattati da l'Intelligenza Artificiale

Lunedì, u Financial Times hà annunziatu un accordu cù OpenAI. FT licenze u so ghjurnalismu mundiale ...

30 April 2024

Pagamenti in linea: Eccu cumu i servizii di streaming vi facenu pagà per sempre

Milioni di persone paganu per i servizii di streaming, paghendu tariffi di abbonamentu mensili. Hè una opinione cumuna chì voi ...

29 April 2024