Artikelen

Serviceproviders in Laravel: wat ze zijn en hoe ze te gebruiken Serviceproviders in Laravel

Laravel-serviceproviders zijn de centrale plaats waar de applicatie wordt gelanceerd. Dat wil zeggen, laravel-kernservices en applicatieservices, klassen en hun afhankelijkheden worden via providers in de servicecontainer geduwd. 

Met andere woorden, dienstverleners zijn als een trechter waardoor we "klasse" brandstof in een tank gieten die de "servicecontainer" wordt genoemd van een motor die Laravel heet.

Voorbeeld

Als we config/app.php openen, zien we een array met de naam "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,
        .
        .
        .
],

Dit zijn enkele van de serviceproviders die samen met laravel worden geleverd, d.w.z. basisdiensten die in de servicecontainer worden geplaatst.

Toen ik service provider worden ze uitgevoerd?

Als we naar de documentatie kijken levenscyclus op aanvraag , worden de volgende bestanden aan het begin uitgevoerd:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php en zijn Middlewares
  • Service Providers: inhoud van dit artikel

quali service provider zijn ze geladen? 

Zij zijn degenen definiten in de 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,
 
    ],
 
];

Zoals we kunnen zien, is er een lijst met service provider niet openbaar in de map /vendor, mogen we ze niet aanraken of wijzigen. Degenen die ons interesseren zijn hieronder, met BroadcastServicerProvider standaard uitgeschakeld, waarschijnlijk omdat het zelden wordt gebruikt.

Al deze serviceproviders lopen van boven naar beneden en herhalen de lijst twee keer:

  • De eerste iteratie is op zoek naar een optionele methode register(), handig voor (uiteindelijk) het uitvoeren van iets dat vóór de methode is geconfigureerd boot().
  • de tweede iteratie voert de methode uit boot() van alle aanbieders. Nogmaals, één voor één, van boven naar beneden, van de array 'providers'.
  • Ten slotte, nadat alle serviceproviders zijn verwerkt, gaat Laravel verder met het ontleden van het pad (route), het uitvoeren van de controller, het gebruik van sjablonen, enz.

Dienstverleners Laravel predefiniti

I Service Providers opgenomen in Laravel, zijn alle aanwezigen in de map app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Het zijn allemaal PHP-klassen, elk gerelateerd aan zijn eigen onderwerp: App, Auth, Broadcasting, Events e Routes. Maar ze hebben allemaal één ding gemeen: methode boot().

Binnen die methode kunnen we elke code schrijven die betrekking heeft op een van die secties: auth, events, route, enz. Met andere woorden, Service Providers zijn slechts klassen om enige globale functionaliteit te registreren.

Ze zijn gescheiden als "providers" omdat ze heel vroeg in de levenscyclus van de applicatie draaien, dus iets globaals is hier handig voordat het uitvoerende script naar Models of Controllers gaat.

De meeste functionaliteit zit in de RouteServiceProvider, hier is 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());
        });
    }
}

Dit is de klasse waar de bestanden worden geconfigureerd routemet routes/web.phproutes/api.php standaard inbegrependefinee. Merk op dat er voor de API ook verschillende configuraties zijn: Eindpuntvoorvoegsel /api en middleware api voor iedereen routes.

We kunnen de service providers, die niet in de map staan /vendor. Het aanpassen van deze bestanden wordt gedaan wanneer u veel paden heeft en deze wilt scheiden in specifieke bestanden. Jij maakt routes/auth.php en zet de paden daar, dan "inschakelen" dat bestand in de methode boot() di RouteServiceProvider, voeg gewoon de derde zin toe:

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

AppServiceProvider het is leeg. Een typisch voorbeeld van het toevoegen van code AppServiceProvider, gaat over het uitschakelen van lazy loading in Eloquent . Om dit te doen, heb je gewoon nodig voeg twee regels toe bij de methode boot():

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Dit genereert een uitzondering als een relatiemodel niet is geladen.

Maak je eigen service provider afgestemde

Naast de pre-bestandendefinites, kunnen we gemakkelijk een nieuwe maken Service Provider, gerelateerd aan andere onderwerpen dan die van vóórdefiklaar als auth/event/routes.

Een vrij typisch voorbeeld is de weergaveconfiguratie Blade. We kunnen een richtlijn opstellen Blade, en voeg vervolgens die code toe aan de methode boot() van welke dan ook service provider, inclusief de standaard AppServiceProvider. Laten we nu een maken ViewServiceProvider apart.

We kunnen het genereren met dit commando:

php artisan make:provider ViewServiceProvider

Wat de klasse zo pre zal genererendefiavond:

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

Zoals we van binnen kunnen zien, zijn er twee methoden:

De register() methode

Met de methode register() kunnen we dit doen definish links naar onze servicecontainer. Bijvoorbeeld in de volgende code:

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

$this->app is een globale variabele in laravel waartoe een singleton-klasse toegang heeft via de app.

Singleton is een functie. Bij het toepassen van deze functie informeren we de applicatie dat elke klasse die als parameter in de app wordt doorgegeven, slechts één instantie in de hele applicatie mag hebben. Dit betekent dat MyClass één keer wordt opgelost en slechts één instantie heeft, die toegankelijk is met behulp van de variabele my_class.

De boot() methode

Met de boot()-methode hebt u toegang tot alle services die eerder zijn geregistreerd met behulp van de register-methode. Via deze methode kunt u vervolgens de gehele dienst opnemen in uw aanvraag.

Terugkerend naar het vorige voorbeeld, laten we de methode verwijderen register() en binnen boot() voeg de Blade-richtlijncode toe:

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

Nog een voorbeeld van ViewServiceProvider groeten View Composers, hier is het fragment van de officiële 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) {
            //
        });
    }
}

Om te kunnen worden uitgevoerd, moet deze nieuwe provider worden toegevoegd aan/geregistreerd in de in 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

Ze zijn mogelijk ook geïnteresseerd in:

Innovatie nieuwsbrief
Mis het belangrijkste nieuws over innovatie niet. Meld u aan om ze per e-mail te ontvangen.

Recente artikelen

Hoe u gegevens en formules het beste kunt ordenen in Excel, voor een goed uitgevoerde analyse

Microsoft Excel is de referentietool voor data-analyse, omdat het veel mogelijkheden biedt voor het organiseren van datasets,…

14 mei 2024

Positieve conclusie voor twee belangrijke Walliance Equity Crowdfunding-projecten: Jesolo Wave Island en Milano Via Ravenna

Walliance, SIM en platform behoren sinds 2017 tot de koplopers in Europa op het gebied van Real Estate Crowdfunding, kondigt de voltooiing aan…

13 mei 2024

Wat is filament en hoe gebruik je Laravel-filament?

Filament is een "versneld" Laravel-ontwikkelingsframework dat verschillende full-stack-componenten biedt. Het is ontworpen om het proces van…

13 mei 2024

Onder controle van kunstmatige intelligentie

«Ik moet terugkeren om mijn evolutie te voltooien: ik zal mezelf in de computer projecteren en pure energie worden. Eenmaal gesetteld…

10 mei 2024

De nieuwe kunstmatige intelligentie van Google kan DNA, RNA en ‘alle moleculen van het leven’ modelleren

Google DeepMind introduceert een verbeterde versie van zijn kunstmatige-intelligentiemodel. Het nieuwe, verbeterde model biedt niet alleen…

9 mei 2024

Ontdek de modulaire architectuur van Laravel

Laravel, beroemd om zijn elegante syntaxis en krachtige functies, biedt ook een solide basis voor modulaire architectuur. Daar…

9 mei 2024

Cisco Hypershield en overname van Splunk Het nieuwe tijdperk van beveiliging begint

Cisco en Splunk helpen klanten hun reis naar het Security Operations Center (SOC) van de toekomst te versnellen met…

8 mei 2024

Naast de economische kant: de niet voor de hand liggende kosten van ransomware

Ransomware heeft het nieuws de afgelopen twee jaar gedomineerd. De meeste mensen weten heel goed dat aanvallen...

6 mei 2024