Artikelen

Service Provider zu Laravel: wat si sinn a wéi Dir Service Provider zu Laravel benotzt

Laravel Déngschtleeschter sinn déi zentral Plaz wou d'Applikatioun gestart gëtt. Dat ass, Kär Laravel Servicer an Applikatioun Servicer, Klassen, an hir Ofhängegkeeten sinn am Service Container iwwer Ubidder gesat. 

An anere Wierder, Déngschtleeschter si wéi en Trichter, duerch deen mir "Klass" Brennstoff an en Tank schëdden deen "Servicebehälter" vun engem Motor genannt Laravel genannt gëtt.

Beispill

Wa mir config/app.php opmaachen, gesi mir eng Array mam Numm "Provider"

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

Dëst sinn e puer vun den Déngschtleeschter déi zesumme mat Laravel zur Verfügung gestallt ginn, dh Basisservicer déi am Servicecontainer plazéiert sinn.

Wann ech service provider ginn se duerchgefouert?

Wa mir d'Dokumentatioun kucken op Ufro Liewenszyklus , ginn déi folgend Dateien am Ufank ausgefouert:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php a seng Middlewares
  • Service Providers: Inhalt vun dësem Artikel

Wéi eng service provider sinn se gelueden? 

Si sinn déi definett an der Array 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,
 
    ],
 
];

Wéi mir kënne gesinn, ass et eng Lëscht vun service provider net ëffentlech am Dossier /vendor, mir sollten se weder beréieren nach änneren. Déi, déi eis interesséieren sinn ënnert, mat BroadcastServicerProvider par défaut behënnert, wahrscheinlech well et selten benotzt gëtt.

All dës Déngschtleeschter lafen vun uewe bis ënnen, widderhuelen d'Lëscht zweemol:

  • Déi éischt Iteratioun sicht no enger optionaler Method register(), nëtzlech fir (schlussendlech) eppes auszeféieren konfiguréiert virun der Method boot().
  • déi zweet Iteratioun féiert d'Method aus boot() vun all Ubidder. Nach eng Kéier, een nom aneren, vun uewe bis ënnen, vun der Array 'providers'.
  • Schlussendlech, nodeems all Déngschtleeschter veraarbecht goufen, geet Laravel weider fir de Wee (Route) ze analyséieren, de Controller ze lafen, Templates ze benotzen, etc.

Service Provider Laravel Predefinit

I Service Providers am Laravel abegraff, sinn all déi am Dossier präsent sinn app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Si sinn all PHP-Klassen, jidderee mat sengem eegenen Thema verbonnen: App, Auth, Broadcasting, Events e Routes. Mä si hunn all eng Saach gemeinsam: Method boot().

Bannent där Method kënne mir all Code am Zesummenhang mat enger vun dësen Sektiounen schreiwen: auth, events, route, etc. An anere Wierder, Service Provider si just Klassen fir eng global Funktionalitéit ze registréieren.

Si sinn getrennt als "Provider" well se ganz fréi am Applikatioun Liewenszyklus lafen, also eppes global ass praktesch hei ier den ausféierende Skript op Modeller oder Controller kënnt.

Déi meescht vun der Funktionalitéit ass am RouteServiceProvider, hei ass de Code:

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

Dëst ass d'Klass wou d'Dateien konfiguréiert sinn routemat routes/web.phproutes/api.php Standard abegraffdefinit. Bedenkt datt fir d'API och verschidde Konfiguratiounen sinn: Endpunkt Präfix /api an middleware api fir jiddereen routes.

Mir kënnen d'Ännerung änneren service providers, déi net am Dossier sinn /vendor. Dës Dateie personaliséieren gëtt gemaach wann Dir vill Weeër hutt a se a spezifesch Dateien trennen wëllt. Dir kreéiert routes/auth.php a setzt d'Weeër dohinner, da "aktivéiert" Dir dës Datei an der Method boot() di RouteServiceProvider, füügt just den drëtte Saz derbäi:

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

AppServiceProvider et ass eidel. En typescht Beispill fir Code ze addéieren AppServiceProvider, geet drëm d'Lazy Luede an Eloquent auszeschalten. Fir dëst ze maachen, braucht Dir just dobäizemaachen zwou Linnen an der Method boot():

Innovatioun Newsletter
Verpasst net déi wichtegst Neiegkeeten iwwer Innovatioun. Registréiert Iech fir se per E-Mail ze kréien.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Dëst wäert eng Ausnahm werfen wann e Bezéiungsmodell net gelueden ass.

Schafen Är eege service provider personnaliséierten

Zousätzlech zu de Pre-Dateiendefinites, kënne mir einfach eng nei eent schafen Service Provider, Zesummenhang mat aneren Themen wéi déi Predefifäerdeg wéi auth/event/routes.

E zimlech typescht Beispill ass d'Vuekonfiguratioun Blade. Mir kënnen eng Direktiv kreéieren Blade, a füügt dann dee Code an d'Method boot() vun all service provider, dorënner de Standard AppServiceProvider. Loosst eis elo eng ViewServiceProvider trennen.

Mir kënnen et mat dësem Kommando generéieren:

php artisan make:provider ViewServiceProvider

Wat wäert d'Klass Generéiere sou PredefiNuecht:

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

Wéi mir bannen kënne gesinn, ginn et zwou Methoden:

Register() Method

D'Register () Method erlaabt eis definish Linken op eise Service Container. Zum Beispill, am folgende Code:

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

$this->App ass eng global Variabel am Laravel, op déi eng Singleton Klass duerch d'App Zougang kann.

Singleton ass eng Feature. Wann Dir dës Feature applizéiert, informéiere mir d'Applikatioun datt egal wéi eng Klass als Parameter an der App passéiert ass nëmmen eng Instanz an der ganzer Applikatioun sollt hunn. Dëst bedeit datt MyClass eemol geléist gëtt an nëmmen eng Instanz huet, déi mat der my_class Variabel zougänglech ass.

D'Boot() Method

D'Boot () Method erlaabt Iech Zougang zu all Servicer déi virdru registréiert sinn mat der Registermethod. Dir kënnt dann de ganze Service an Ärer Applikatioun mat dëser Method enthalen.

Zréck op dat viregt Beispill, loosst eis d'Method ewechhuelen register() an bannen boot() add the Blade Direktiv Code:

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

Anert Beispill vun ViewServiceProvider betruecht View Composers, hei ass den Ausschnëtt vum offiziellen Laravel Site :

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

Fir ze lafen, muss dësen neie Fournisseur derbäigesat / registréiert ginn am Provider 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

Dir kënnt och interesséiert sinn:

Innovatioun Newsletter
Verpasst net déi wichtegst Neiegkeeten iwwer Innovatioun. Registréiert Iech fir se per E-Mail ze kréien.

Recent Artikelen

D'Zukunft ass hei: Wéi d'Schëfferindustrie d'Weltwirtschaft revolutionéiert

De Marinesecteur ass eng richteg global wirtschaftlech Muecht, déi op e 150 Milliarde Maart navigéiert ass ...

1 Mee 2024

Verëffentlecher an OpenAI ënnerschreiwen Ofkommes fir de Flux vun Informatioun ze regléieren, déi vu Kënschtlech Intelligenz veraarbecht gëtt

De leschte Méindeg huet d'Financial Times en Deal mat OpenAI ugekënnegt. FT lizenzéiert säi Weltklass Journalismus ...

30 Abrëll 2024

Online Bezuelungen: Hei ass wéi Streaming Servicer Iech fir ëmmer bezuelen

Millioune vu Leit bezuelen fir Streaming Servicer, a bezuelen monatlecht Abonnementskäschte. Et ass allgemeng Meenung datt Dir ...

29 Abrëll 2024

Veeam huet déi ëmfaassendst Ënnerstëtzung fir Ransomware, vu Schutz bis Äntwert an Erhuelung

Coveware vu Veeam wäert weider Cyber ​​Erpressung Tëschefall Äntwert Servicer ubidden. Coveware wäert Forensik a Sanéierungsfäegkeeten ubidden ...

23 Abrëll 2024