Članki

Ponudniki storitev v Laravel: kaj so in kako uporabljati ponudnike storitev v Laravel

Ponudniki storitev Laravel so osrednje mesto, kjer se aplikacija zažene. To pomeni, da so osnovne storitve laravel in storitve aplikacij, razredi in njihove odvisnosti potisnjeni v vsebnik storitev prek ponudnikov. 

Z drugimi besedami, ponudniki storitev so kot lijak, skozi katerega pretakamo "razredno" gorivo v rezervoar, imenovan "servisni kontejner" motorja, imenovanega Laravel.

primer

Če odpremo config/app.php, bomo videli polje z imenom "ponudnik"

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

To so nekateri ponudniki storitev, ki so na voljo skupaj z laravelom, tj. osnovne storitve, ki so nameščene v storitvenem vsebniku.

Ko jaz service provider se izvajajo?

Če pogledamo dokumentacijo na zahtevo življenjski cikel , se na začetku izvedejo naslednje datoteke:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php in njegovo Middlewares
  • Service Providers: vsebina tega članka

ocenju service provider so naložene? 

Oni so tisti definite v nizu 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,
 
    ],
 
];

Kot lahko vidimo, obstaja seznam service provider ni javno v mapi /vendor, se jih ne smemo niti dotikati niti spreminjati. Tisti, ki nas zanimajo, so spodaj, z BroadcastServicerProvider privzeto onemogočeno, verjetno zato, ker se redko uporablja.

Vsi ti ponudniki storitev potekajo od zgoraj navzdol in ponavljajo seznam dvakrat:

  • Prva ponovitev išče neobvezno metodo register(), uporabno za (končno) izvajanje nečesa, kar je bilo konfigurirano pred metodo boot().
  • druga ponovitev izvede metodo boot() vseh ponudnikov. Spet enega za drugim, od vrha do dna niza 'providers'.
  • Končno, ko so vsi ponudniki storitev obdelani, Laravel nadaljuje z razčlenjevanjem poti (poti), izvajanjem krmilnika, uporabo predlog itd.

Ponudniki storitev Laravel predefiniti

I Service Providers vključeni v Laravel, so vsi prisotni v mapi app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Vsi so razredi PHP, vsak povezan s svojo temo: App, Auth, Broadcasting, Events e Routes. Vsem pa je skupno eno: metoda boot().

Znotraj te metode lahko napišemo katero koli kodo, povezano s katerim koli od teh razdelkov: auth, events, routeitd. Z drugimi besedami, ponudniki storitev so samo razredi za registracijo nekaterih globalnih funkcij.

Ločeni so kot "ponudniki", ker se izvajajo zelo zgodaj v življenjskem ciklu aplikacije, zato je nekaj globalnega primernega tukaj, preden izvajalni skript pride do modelov ali krmilnikov.

Večina funkcionalnosti je v RouteServiceProvider, tukaj je koda:

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

To je razred, v katerem so konfigurirane datoteke route, Z routes/web.phproutes/api.php vključeno privzetodefinita. Upoštevajte, da za API obstajajo tudi različne konfiguracije: Predpona končne točke /api in vmesno programsko opremo api za vse routes.

Lahko uredimo service providers, ki jih ni v mapi /vendor. Te datoteke prilagodite po meri, ko imate veliko poti in jih želite ločiti v določene datoteke. Vi ustvarjate routes/auth.php in tam vnesete poti, potem to datoteko "omogočite" v metodi boot() di RouteServiceProvider, samo dodajte tretji stavek:

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

AppServiceProvider prazen je. Tipičen primer dodajanja kode AppServiceProvider, govori o onemogočanju lenega nalaganja v Eloquentu. Če želite to narediti, potrebujete le dodajte dve vrstici v metodi boot():

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

To bo povzročilo izjemo, če model razmerja ni naložen.

Ustvari svojega service provider prilagodili

Poleg pred datotekdefinites, lahko preprosto ustvarimo novega Service Provider, povezanih z drugimi temami kot s tistimi preddefikončal kot auth/event/routes.

Dokaj tipičen primer je konfiguracija pogleda Blade. Ustvarimo lahko direktivo Bladein nato dodajte to kodo v metodo boot() katerega koli service provider, vključno s privzetim AppServiceProvider. Ustvarimo zdaj a ViewServiceProvider ločiti.

Ustvarimo ga lahko s tem ukazom:

php artisan make:provider ViewServiceProvider

Kar bo ustvarilo razred tako predefinoč:

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

Kot lahko vidimo, obstajata dva načina:

Metoda register().

Metoda register() nam omogoča definish povezave do našega servisnega vsebnika. Na primer v naslednji kodi:

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

$this->app je globalna spremenljivka v laravel, do katere lahko razred singleton dostopa prek aplikacije.

Singleton je funkcija. Pri uporabi te funkcije obveščamo aplikacijo, da mora imeti kateri koli razred, ki je v aplikaciji posredovan kot parameter, samo en primerek v celotni aplikaciji. To pomeni, da bo MyClass razrešen enkrat in bo imel samo en primerek, do katerega lahko dostopate s spremenljivko my_class.

Metoda boot().

Metoda boot() vam omogoča dostop do vseh storitev, ki ste jih predhodno registrirali z metodo register. S to metodo lahko nato v svojo aplikacijo vključite celotno storitev.

Če se vrnemo k prejšnjemu primeru, odstranimo metodo register() in znotraj boot() dodajte kodo direktive Blade:

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

Še en primer ViewServiceProvider zadeva View Composers, tukaj je delček z uradne strani 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) {
            //
        });
    }
}

Za zagon je treba tega novega ponudnika dodati/registrirati v matriko ponudnikov 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

Morda vas bo zanimalo tudi:

Glasilo o inovacijah
Ne zamudite najpomembnejših novic o inovacijah. Prijavite se, če jih želite prejemati po e-pošti.

Nedavni članki

Veeam ponuja najobsežnejšo podporo za izsiljevalsko programsko opremo, od zaščite do odziva in obnovitve

Coveware by Veeam bo še naprej zagotavljal storitve odzivanja na incidente kibernetskega izsiljevanja. Coveware bo nudil forenziko in zmogljivosti sanacije ...

April 23 2024

Zelena in digitalna revolucija: kako predvideno vzdrževanje preoblikuje naftno in plinsko industrijo

Prediktivno vzdrževanje revolucionira sektor nafte in plina z inovativnim in proaktivnim pristopom k upravljanju obratov.…

April 22 2024

Britanski protimonopolni regulator sproži alarm BigTech zaradi GenAI

Britanski CMA je izdal opozorilo glede obnašanja Big Tech na trgu umetne inteligence. tam …

April 18 2024

Casa Green: energetska revolucija za trajnostno prihodnost v Italiji

Odlok "Case Green", ki ga je oblikovala Evropska unija za povečanje energetske učinkovitosti stavb, je zaključil svoj zakonodajni postopek z ...

April 18 2024