Č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

Inovativna intervencija v obogateni resničnosti z Apple viewerjem na polikliniki Catania

Operacija oftalmoplastike s komercialnim pregledovalnikom Apple Vision Pro je bila opravljena na polikliniki Catania…

3 maja 2024

Prednosti pobarvank za otroke - svet čarovnije za vse starosti

Razvijanje finih motoričnih spretnosti z barvanjem otroke pripravi na kompleksnejše spretnosti, kot je pisanje. Za barvanje…

2 maja 2024

Prihodnost je tukaj: Kako ladjarska industrija revolucionira svetovno gospodarstvo

Pomorski sektor je prava svetovna gospodarska sila, ki je krmarila proti 150 milijardnemu trgu...

1 maja 2024

Založniki in OpenAI podpisujejo sporazume za urejanje pretoka informacij, ki jih obdeluje umetna inteligenca

Prejšnji ponedeljek je Financial Times objavil dogovor z OpenAI. FT licencira svoje vrhunsko novinarstvo ...

April 30 2024