Artikoloj

Servoprovizantoj en Laravel: kio ili estas kaj kiel uzi Servoprovizantoj en Laravel

Laravel-servoprovizantoj estas la centra loko kie la aplikaĵo estas komencita. Tio estas, kernaj Laravel-servoj kaj aplikaĵservoj, klasoj, kaj iliaj dependecoj estas metitaj en la servujon per provizantoj. 

Alivorte, servoprovizantoj estas kiel funelo tra kiu ni verŝas "klasan" fuelon en tankon nomatan "servujo" de motoro nomita Laravel.

ekzemple

Se ni malfermas config/app.php ni vidos tabelon kun la nomo "provizanto"

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

Ĉi tiuj estas kelkaj el la servaj provizantoj kune kun laravel, t.e. bazaj servoj, kiuj estas metitaj en la servan ujo.

Kiam mi service provider ĉu ili estas faritaj?

Se ni rigardas la dokumentadon laŭ peto vivociklo , la sekvaj dosieroj estas ekzekutitaj komence:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php kaj lia Middlewares
  • Service Providers: enhavo de ĉi tiu artikolo

Kvali service provider ĉu ili estas ŝarĝitaj? 

Ili estas tiuj definits en la tabelo 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,
 
    ],
 
];

Kiel ni povas vidi, estas listo de service provider ne publika en la dosierujo /vendor, ni devas nek tuŝi nek modifi ilin. Tiuj, kiuj interesas nin, estas sube, kun BroadcastServicerProvider malebligita defaŭlte, verŝajne ĉar ĝi estas malofte uzata.

Ĉiuj ĉi tiuj servaj provizantoj kuras de supre al sube, ripetante la liston dufoje:

  • La unua ripeto serĉas laŭvolan metodon register(), utila por (eventuale) ekzekuti ion agorditan antaŭ la metodo boot().
  • la dua ripeto efektivigas la metodon boot() de ĉiuj provizantoj. Denove, unu post alia, de supre al malsupre, de la tabelo 'providers'.
  • Fine, post kiam ĉiuj servaj provizantoj estas prilaboritaj, Laravel pluiras al analizo de la vojo (itinero), ruli la regilon, uzi ŝablonojn ktp.

Servoprovizantoj Laravel predefiniti

I Service Providers inkluzivitaj en Laravel, estas ĉiuj ĉeestantoj en la dosierujo app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Ili estas ĉiuj PHP-klasoj, ĉiu rilata al sia propra temo: App, Auth, Broadcasting, Events e Routes. Sed ili ĉiuj havas unu komunan aferon: metodo boot().

Ene de tiu metodo, ni povas skribi ajnan kodon rilatan al iu el tiuj sekcioj: auth, events, route, ktp. Alivorte, Servaj Provizantoj estas nur klasoj por registri iun tutmondan funkciecon.

Ili estas apartaj kiel "provizantoj" ĉar ili funkcias tre frue en la aplikaĵa vivociklo, do io tutmonda estas oportuna ĉi tie antaŭ ol la ekzekuta skripto atingas Modelojn aŭ Regilojn.

Plejparto de la funkcio estas en la RouteServiceProvider, jen la kodo:

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

Ĉi tiu estas la klaso kie la dosieroj estas agordita routekun routes/web.phproutes/api.php inkluzivita defaŭltedefinita. Notu, ke por la API ekzistas ankaŭ malsamaj agordoj: Finpunkto-prefikso /api kaj mezvaro api por ĉiuj routes.

Ni povas redakti la service providers, kiuj ne estas en la dosierujo /vendor. Agordo de ĉi tiuj dosieroj estas farita kiam vi havas multajn vojojn kaj volas apartigi ilin en specifajn dosierojn. Vi kreas routes/auth.php kaj metu la vojojn tien, tiam vi "aktivigas" tiun dosieron en la metodo boot() di RouteServiceProvider, nur aldonu la trian frazon:

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

AppServiceProvider ĝi estas malplena. Tipa ekzemplo de aldono de kodo AppServiceProvider, temas pri malfunkciigado de maldiligenta ŝarĝo en Elokvent . Por fari tion, vi nur bezonas aldonu du liniojn en la metodo boot():

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Ĉi tio ĵetos escepton se rilatmodelo ne estas ŝarĝita.

Kreu vian propran service provider adaptitajn

Krom la pre dosierojdefinotojn, ni povas facile krei novan Service Provider, rilataj al aliaj temoj ol tiuj predefifinis kiel auth/event/routes.

Sufiĉe tipa ekzemplo estas la vidkonfiguracio Blade. Ni povas krei direktivon Blade, kaj poste aldonu tiun kodon en la metodon boot() de iu ajn service provider, inkluzive de la defaŭlta AppServiceProvider. Ni nun kreu a ViewServiceProvider aparta.

Ni povas generi ĝin per ĉi tiu komando:

php artisan make:provider ViewServiceProvider

Kiu generos la klason tiel predefinokto:

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

Kiel ni povas vidi interne, estas du metodoj:

La metodo register().

La metodo register() permesas al ni defifini ligilojn al nia serva ujo. Ekzemple, en la sekva kodo:

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

$this->app estas tutmonda variablo en laravel, kiun singleton klaso povas aliri per la app.

Singleton estas trajto. Kiam ni aplikas ĉi tiun funkcion, ni informas la aplikaĵon, ke kia ajn klaso estas pasigita kiel parametro en la aplikaĵo devus havi nur unu okazon en la tuta aplikaĵo. Ĉi tio signifas, ke MyClass estos solvita unufoje kaj havos nur unu kazon, kiun oni povas aliri uzante la variablon my_class.

La metodo boot().

La metodo boot() permesas al vi aliri ĉiujn servojn antaŭe registritajn per la registra metodo. Vi povas tiam inkluzivi la tutan servon en via aplikaĵo uzante ĉi tiun metodon.

Revenante al la antaŭa ekzemplo, ni forigu la metodon register() kaj interne boot() aldonu la Blade-direktivkodon:

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

Alia ekzemplo de ViewServiceProvider konsidero View Composers, jen la fragmento de la oficiala Laravel-ejo :

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

Por funkcii, ĉi tiu nova provizanto devas esti aldonita/registrita al la en provizanta tabelo 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

Vi ankaŭ povas interesiĝi pri:

Informilo pri novigo
Ne maltrafu la plej gravajn novaĵojn pri novigado. Registriĝi por ricevi ilin retpoŝte.

Lastaj artikoloj

La Estonteco Estas Ĉi tie: Kiel la ŝipindustrio revolucias la tutmondan ekonomion

La maramea sektoro estas vera tutmonda ekonomia potenco, kiu navigis al merkato de 150 miliardoj...

1 Majo 2024

Eldonistoj kaj OpenAI subskribas interkonsentojn por reguligi la fluon de informoj prilaboritaj de Artefarita Inteligenteco

Pasintlunde, la Financial Times anoncis interkonsenton kun OpenAI. FT licencas sian mondklasan ĵurnalismon...

30 aprilo 2024

Interretaj Pagoj: Jen Kiel Fluaj Servoj Faras Vin Pagi Eterne

Milionoj da homoj pagas por streaming-servoj, pagante monatajn abonkotizojn. Estas komuna opinio, ke vi...

29 aprilo 2024

Veeam havas la plej ampleksan subtenon por ransomware, de protekto ĝis respondo kaj reakiro

Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...

23 aprilo 2024