Artiklid

Laraveli teenusepakkujad: mis need on ja kuidas teenusepakkujaid Laravelis kasutada

Laraveli teenusepakkujad on rakenduse käivitamise keskne koht. See tähendab, et Laraveli põhiteenused ja rakendusteenused, klassid ja nende sõltuvused paigutatakse pakkujate kaudu teenusekonteinerisse. 

Teisisõnu, teenusepakkujad on nagu lehter, mille kaudu valame "klassi" kütust Laraveli-nimelise mootori "teeninduskonteineriks" kutsutavasse paaki.

näide

Kui avame config/app.php, näeme massiivi nimega "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,
        .
        .
        .
],

Need on mõned koos laraveliga pakutavad teenusepakkujad ehk põhiteenused, mis paigutatakse teenusekonteinerisse.

Kui ma service provider kas neid tehakse?

Kui vaatame dokumentatsiooni nõudmisel elutsükkel , käivitatakse alguses järgmised failid:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php ja tema Middlewares
  • Service Providers: selle artikli sisu

kva service provider kas need on laetud? 

Need on need definites massiivi 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,
 
    ],
 
];

Nagu näeme, on olemas nimekiri service provider pole kaustas avalik /vendor, ei tohiks me neid puudutada ega muuta. Need, mis meid huvitavad, on allpool, koos BroadcastServicerProvider vaikimisi keelatud, tõenäoliselt seetõttu, et seda kasutatakse harva.

Kõik need teenusepakkujad jooksevad ülalt alla, korrates loendit kaks korda:

  • Esimene iteratsioon otsib valikulist meetodit register(), on kasulik (lõpuks) enne meetodit seadistatud asjade käivitamiseks boot().
  • teine ​​iteratsioon käivitab meetodi boot() kõigist pakkujatest. Jällegi ükshaaval, ülevalt alla, massiivist 'providers'.
  • Lõpuks, pärast seda, kui kõik teenusepakkujad on töödeldud, jätkab Laravel tee (marsruudi) sõelumist, kontrolleri käivitamist, mallide kasutamist jne.

Teenusepakkujad Laravel predefiniti

I Service Providers Laravelis on kõik kaustas olevad isikud app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Need on kõik PHP klassid, millest igaüks on seotud oma teemaga: App, Auth, Broadcasting, Events e Routes. Kuid neil kõigil on üks ühine joon: meetod boot().

Selle meetodi sees saame kirjutada mis tahes koodi, mis on seotud mis tahes nende jaotistega: auth, events, route, jne. Teisisõnu, teenusepakkujad on lihtsalt klassid mõne globaalse funktsiooni registreerimiseks.

Need on "pakkujatena" eraldiseisvad, kuna töötavad väga varajases rakenduse elutsüklis, nii et midagi globaalset on siin mugav enne, kui käivitav skript jõuab mudelitesse või kontrolleritesse.

Enamik funktsioone on RouteServiceProvideris, siin on kood:

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

See on klass, kus failid on konfigureeritud route, Mis routes/web.phproutes/api.php vaikimisi kaasatuddefinita. Pange tähele, et API jaoks on olemas ka erinevad konfiguratsioonid: lõpp-punkti eesliide /api ja vahevara api kõigi jaoks routes.

Saame redigeerida service providers, mida kaustas pole /vendor. Nende failide kohandamine toimub siis, kui teil on palju teid ja soovite need konkreetseteks failideks eraldada. Sina lood routes/auth.php ja pane teed sinna, siis "lubad" selle faili meetodis boot() di RouteServiceProvider, lisage lihtsalt kolmas lause:

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

AppServiceProvider see on tühi. Tüüpiline näide koodi lisamisest AppServiceProvider, käsitleb laiska laadimise keelamist rakenduses Eloquent. Selleks vajate lihtsalt lisage kaks rida meetodis boot():

Innovatsiooni uudiskiri
Ärge jätke ilma kõige olulisematest uuendustest. Registreeruge, et saada neid meili teel.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

See loob erandi, kui suhtemudelit ei laadita.

Looge oma service provider tava

Lisaks eelfailideledefinites, saame hõlpsasti uue luua Service Provider, mis on seotud muude teemadega kui need, mis on eelnevaddefilõpetanud kui auth/event/routes.

Üsna tüüpiline näide on vaate konfiguratsioon Blade. Saame koostada direktiivi Bladeja lisage see kood meetodisse boot() mis tahes service provider, sealhulgas vaikeseade AppServiceProvider. Loome nüüd a ViewServiceProvider eraldi.

Saame selle genereerida järgmise käsuga:

php artisan make:provider ViewServiceProvider

Mis loob klassi nii ettedefiõhtupoolik:

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

Nagu seestpoolt näeme, on kaks meetodit:

register() meetod

Meetod register() võimaldab meil seda teha definish lingid meie teeninduskonteinerisse. Näiteks järgmises koodis:

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

$this->app on laraveli globaalne muutuja, millele üksikklass pääseb rakenduse kaudu juurde.

Singleton on funktsioon. Selle funktsiooni rakendamisel teavitame rakendust, et mis tahes klassis, mis rakenduses parameetrina edastatakse, peaks kogu rakenduses olema ainult üks eksemplar. See tähendab, et MyClass lahendatakse üks kord ja sellel on ainult üks eksemplar, millele pääseb juurde muutuja my_class abil.

Boot() meetod

Boot() meetod võimaldab teil pääseda juurde kõikidele varem registreerimismeetodil registreeritud teenustele. Seejärel saate seda meetodit kasutades oma rakendusse kaasata kogu teenuse.

Eelmise näite juurde tagasi tulles eemaldame meetodi register() ja sees boot() lisage Blade'i direktiivi kood:

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

Veel üks näide ViewServiceProvider see puudutab View Composers, siin on katkend Laraveli ametlikult saidilt :

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

Käitamiseks tuleb see uus pakkuja lisada/registreerida teenusepakkuja massiivi 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

Samuti võite olla huvitatud:

Innovatsiooni uudiskiri
Ärge jätke ilma kõige olulisematest uuendustest. Registreeruge, et saada neid meili teel.

Viimased artiklid

Veeam pakub lunavarale kõige põhjalikumat tuge alates kaitsest kuni reageerimise ja taastamiseni

Veeami Coveware jätkab küberväljapressimise juhtumitele reageerimise teenuste pakkumist. Coveware pakub kohtuekspertiisi ja heastamisvõimalusi…

Aprill 23 2024

Roheline ja digitaalne revolutsioon: kuidas ennustav hooldus muudab nafta- ja gaasitööstust

Ennustav hooldus muudab nafta- ja gaasisektori pöördeliseks uuendusliku ja ennetava lähenemisega tehaste juhtimisele.…

Aprill 22 2024

Ühendkuningriigi monopolivastane regulaator tõstab BigTechi häire GenAI pärast

Ühendkuningriigi CMA on väljastanud hoiatuse Big Techi käitumise kohta tehisintellekti turul. Seal…

Aprill 18 2024

Casa Green: energiarevolutsioon jätkusuutliku tuleviku nimel Itaalias

Euroopa Liidu poolt hoonete energiatõhususe suurendamiseks koostatud roheliste majade dekreet on lõpetanud oma seadusandliku protsessi…

Aprill 18 2024