Artikler

Tjenesteudbydere i Laravel: hvad de er, og hvordan man bruger tjenesteudbydere i Laravel

Laravel-tjenesteudbydere er det centrale sted, hvor applikationen lanceres. Det vil sige, at laravel kernetjenester og applikationstjenester, klasser og deres afhængigheder skubbes ind i servicebeholderen via udbydere. 

Med andre ord er serviceudbydere som en tragt, hvorigennem vi hælder "klasse" brændstof i en tank kaldet "servicebeholderen" på en motor kaldet Laravel.

eksempel

Hvis vi åbner config/app.php vil vi se et array med navnet "udbyder"

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

Det er nogle af de serviceudbydere, der leveres sammen med laravel, det vil sige basistjenester, som er placeret i servicecontaineren.

Når jeg service provider udføres de?

Hvis vi ser på dokumentationen på forespørgsel livscyklus , udføres følgende filer i starten:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php og hans Middlewares
  • Service Providers: indholdet af denne artikel

kvali service provider er de indlæst? 

Det er dem definites 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 der en liste over service provider ikke offentlig i mappen /vendor, vi bør hverken røre ved eller ændre dem. Dem, der interesserer os, er nedenfor, med BroadcastServicerProvider deaktiveret som standard, sandsynligvis fordi den sjældent bruges.

Alle disse tjenesteudbydere kører fra top til bund og gentager listen to gange:

  • Den første iteration leder efter en valgfri metode register(), nyttig til (til sidst) at udføre noget, der er konfigureret før metoden boot().
  • den anden iteration udfører metoden boot() af alle udbydere. Igen, en efter en, top til bund, af arrayet 'providers'.
  • Endelig, efter at alle tjenesteudbydere er blevet behandlet, går Laravel videre til at analysere stien (ruten), køre controlleren, bruge skabeloner osv.

Tjenesteudbydere Laravel predefiNiTi

I Service Providers inkluderet i Laravel, er alle tilstedeværende i mappen app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

De er alle PHP-klasser, hver relateret til sit eget emne: App, Auth, Broadcasting, Events e Routes. Men de har alle én ting til fælles: metode boot().

Inde i denne metode kan vi skrive enhver kode, der er relateret til en af ​​disse sektioner: auth, events, route, etc. Med andre ord er tjenesteudbydere kun klasser til at registrere noget global funktionalitet.

De er adskilte som "udbydere", fordi de kører meget tidligt i applikationens livscyklus, så noget globalt er praktisk her, før det eksekverende script kommer til modeller eller controllere.

Det meste af funktionaliteten 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, hvor filerne er konfigureret route, Med routes/web.phproutes/api.php inkluderet som standarddefinita. Bemærk, at for API'en er der også forskellige konfigurationer: Endpoint-præfiks /api og middleware api for alle routes.

Vi kan redigere service providers, som ikke er i mappen /vendor. Tilpasning af disse filer udføres, når du har mange stier og ønsker at adskille dem i specifikke filer. Du skaber routes/auth.php og læg stierne der, så "aktiverer" du den fil i metoden boot() di RouteServiceProvider, tilføj blot den tredje sætning:

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

AppServiceProvider den er tom. Et typisk eksempel på tilføjelse af kode AppServiceProvider, handler om at deaktivere doven indlæsning i Eloquent . For at gøre dette behøver du bare tilføje to linjer i metoden boot():

Nyhedsbrev om innovation
Gå ikke glip af de vigtigste nyheder om innovation. Tilmeld dig for at modtage dem via e-mail.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Dette vil give en undtagelse, hvis en relationsmodel ikke er indlæst.

Opret din egen service provider tilpasset

Ud over pre-filernedefinites, kan vi nemt oprette en ny Service Provider, relateret til andre emner end de førdefifærdig som auth/event/routes.

Et ret typisk eksempel er visningskonfigurationen Blade. Vi kan lave et direktiv Blade, og tilføj derefter denne kode i metoden boot() af enhver service provider, inklusive standard AppServiceProvider. Lad os nu skabe en ViewServiceProvider separator.

Vi kan generere det med denne kommando:

php artisan make:provider ViewServiceProvider

Hvilket vil generere klassen så predefiaften:

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 indeni er der to metoder:

Register() metoden

Register()-metoden giver os mulighed for definish links til vores servicecontainer. 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å adgang til via appen.

Singleton er en funktion. Når vi anvender denne funktion, informerer vi applikationen om, at uanset hvilken klasse, der sendes som en parameter i appen, kun skal have én forekomst i hele applikationen. Det betyder, at MyClass vil blive løst én gang og kun vil have én instans, som kan tilgås ved hjælp af my_class-variablen.

Boot() metoden

Boot()-metoden giver dig adgang til alle tjenester, der tidligere er registreret ved hjælp af registermetoden. Du kan derefter inkludere hele tjenesten i din ansøgning ved hjælp af denne metode.

Går tilbage til det forrige eksempel, lad os fjerne metoden register() og indeni boot() tilføj 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'); ?>";
    });
}

Endnu et eksempel på ViewServiceProvider det angår View Composers, her er uddraget fra den officielle Laravel-side :

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 at køre, skal denne nye udbyder tilføjes/registreres til udbyderens array 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 interesseret i:

Nyhedsbrev om innovation
Gå ikke glip af de vigtigste nyheder om innovation. Tilmeld dig for at modtage dem via e-mail.

Seneste artikler

Fremtiden er her: Hvordan shippingindustrien revolutionerer den globale økonomi

Flådesektoren er en sand global økonomisk magt, som har navigeret mod et 150 milliarder marked...

1 maj 2024

Udgivere og OpenAI underskriver aftaler for at regulere strømmen af ​​information, der behandles af kunstig intelligens

Sidste mandag offentliggjorde Financial Times en aftale med OpenAI. FT licenserer sin verdensklasses journalistik...

30 April 2024

Onlinebetalinger: Her er hvordan streamingtjenester får dig til at betale for evigt

Millioner af mennesker betaler for streamingtjenester og betaler månedlige abonnementsgebyrer. Det er almindelig opfattelse, at du...

29 April 2024

Veeam har den mest omfattende support til ransomware, fra beskyttelse til respons og gendannelse

Coveware by Veeam vil fortsætte med at levere responstjenester til cyberafpresning. Coveware vil tilbyde kriminaltekniske og afhjælpende funktioner...

23 April 2024