Artikler

Tjenesteleverandører i Laravel: hva de er og hvordan du bruker tjenesteleverandører i Laravel

Laravel-tjenesteleverandører er det sentrale stedet der applikasjonen startes. Det vil si at Laravels kjernetjenester og applikasjonstjenester, klasser og deres avhengigheter plasseres i tjenestebeholderen via leverandører. 

Med andre ord, tjenesteleverandører er som en trakt der vi heller "klasse" drivstoff i en tank kalt "servicebeholderen" til en motor kalt Laravel.

eksempel

Hvis vi åpner config/app.php vil vi se en matrise med navnet "leverandør"

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

Dette er noen av tjenesteleverandørene som leveres sammen med laravel, det vil si basistjenester som legges i servicecontaineren.

Når jeg service provider blir de utført?

Hvis vi ser på dokumentasjonen på forespørsel livssyklus , blir følgende filer utført i starten:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php og hans Middlewares
  • Service Providers: innholdet i denne artikkelen

Hva service provider er de lastet? 

Det er de definetter i arrayet 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,
 
    ],
 
];

Som vi kan se, er det en liste over service provider ikke offentlig i mappen /vendor, vi bør verken berøre eller endre dem. De som interesserer oss er under, med BroadcastServicerProvider deaktivert som standard, sannsynligvis fordi den sjelden brukes.

Alle disse tjenesteleverandørene kjører fra topp til bunn, og gjentar listen to ganger:

  • Den første iterasjonen ser etter en valgfri metode register(), nyttig for (til slutt) å utføre noe konfigurert før metoden boot().
  • den andre iterasjonen utfører metoden boot() av alle tilbydere. Igjen, en etter en, topp til bunn, av matrisen 'providers'.
  • Til slutt, etter at alle tjenesteleverandørene er behandlet, går Laravel videre til å analysere banen (ruten), kjøre kontrolleren, bruke maler osv.

Tjenesteleverandører Laravel predefiNiTi

I Service Providers inkludert i Laravel, er alle de som er tilstede i mappen app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

De er alle PHP-klasser, hver relatert til sitt eget emne: App, Auth, Broadcasting, Events e Routes. Men de har alle én ting til felles: metode boot().

Inne i den metoden kan vi skrive hvilken som helst kode relatert til noen av disse seksjonene: auth, events, route, etc. Med andre ord, tjenesteleverandører er bare klasser for å registrere noe global funksjonalitet.

De er separate som "leverandører" fordi de kjører veldig tidlig i applikasjonens livssyklus, så noe globalt er praktisk her før det kjørende skriptet kommer til modeller eller kontroller.

Det meste av funksjonaliteten er i RouteServiceProvider, her er koden:

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

Dette er klassen der filene er konfigurert route, Med routes/web.phproutes/api.php inkludert som standarddefinita. Merk at for API er det også forskjellige konfigurasjoner: Endpoint prefix /api og mellomvare api for alle routes.

Vi kan redigere service providers, som ikke er i mappen /vendor. Tilpasning av disse filene gjøres når du har mange baner og ønsker å dele dem i spesifikke filer. Du skaper routes/auth.php og legg stiene der, så "aktiverer" du den filen i metoden boot() di RouteServiceProvider, bare legg til den tredje setningen:

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

AppServiceProvider den er tom. Et typisk eksempel på å legge til kode AppServiceProvider, handler om å deaktivere lat lasting i Eloquent . For å gjøre dette trenger du bare legg til to linjer i metoden boot():

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Dette vil gi et unntak hvis en relasjonsmodell ikke er lastet inn.

Lag din egen service provider tilpasset

I tillegg til forhåndsfilenedefinetter, kan vi enkelt lage en ny Service Provider, relatert til andre emner enn de førdefiferdig som auth/event/routes.

Et ganske typisk eksempel er visningskonfigurasjonen Blade. Vi kan lage et direktiv Blade, og legg deretter til den koden i metoden boot() av noen service provider, inkludert standard AppServiceProvider. La oss nå lage en ViewServiceProvider skille.

Vi kan generere den med denne kommandoen:

php artisan make:provider ViewServiceProvider

Som vil generere klassen så predefikveld:

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

Som vi kan se på innsiden er det to metoder:

Register()-metoden

Register()-metoden lar oss definish linker til vår servicebeholder. For eksempel i følgende kode:

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

$this->app er en global variabel i laravel som en singleton-klasse kan få tilgang til gjennom appen.

Singleton er en funksjon. Når vi bruker denne funksjonen, informerer vi applikasjonen om at uansett hvilken klasse som sendes som en parameter i appen bare skal ha én forekomst i hele applikasjonen. Dette betyr at MyClass vil bli løst én gang og vil bare ha én forekomst, som kan nås ved å bruke my_class-variabelen.

Boot()-metoden

Boot()-metoden lar deg få tilgang til alle tjenester som tidligere er registrert ved hjelp av registermetoden. Du kan deretter inkludere hele tjenesten i søknaden din ved å bruke denne metoden.

Gå tilbake til forrige eksempel, la oss fjerne metoden register() og innenfor boot() legg til Blade-direktivkoden:

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

Et annet eksempel på ViewServiceProvider det berører View Composers, her er utdraget fra den offisielle Laravel-siden :

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

For å kjøre, må denne nye leverandøren legges til/registreres i leverandørarrayet 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

Du kan også være interessert i:

Nyhetsbrev for innovasjon
Ikke gå glipp av de viktigste nyhetene om innovasjon. Registrer deg for å motta dem på e-post.

Siste artikler

Utgivere og OpenAI signerer avtaler for å regulere flyten av informasjon som behandles av kunstig intelligens

Sist mandag kunngjorde Financial Times en avtale med OpenAI. FT lisensierer sin journalistikk i verdensklasse...

30 april 2024

Nettbetalinger: Her er hvordan strømmetjenester får deg til å betale for alltid

Millioner av mennesker betaler for strømmetjenester og betaler månedlige abonnementsavgifter. Det er vanlig oppfatning at du...

29 april 2024

Veeam har den mest omfattende støtten for løsepengevare, fra beskyttelse til respons og gjenoppretting

Coveware by Veeam vil fortsette å tilby responstjenester for cyberutpressing. Coveware vil tilby kriminaltekniske og utbedringsmuligheter...

23 april 2024

Grønn og digital revolusjon: Hvordan prediktivt vedlikehold transformerer olje- og gassindustrien

Prediktivt vedlikehold revolusjonerer olje- og gasssektoren, med en innovativ og proaktiv tilnærming til anleggsledelse...

22 april 2024