Članci

Dobavljači usluga u Laravelu: šta su i kako koristiti pružatelje usluga u Laravelu

Laravel provajderi usluga su centralno mjesto gdje se aplikacija pokreće. To jest, osnovne Laravel servise i servisi aplikacija, klase i njihove zavisnosti se stavljaju u kontejner usluge preko provajdera. 

Drugim riječima, serviseri su poput lijevka kroz koji sipamo gorivo "klase" u rezervoar koji se zove "servisni kontejner" motora koji se zove Laravel.

primjer

Ako otvorimo config/app.php vidjet ćemo niz sa imenom “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,
        .
        .
        .
],

Ovo su neki od provajdera usluga koji se pružaju zajedno sa laravel-om, odnosno osnovnim servisima koji su smešteni u servisni kontejner.

Kada ja service provider da li se izvode?

Ako pogledamo dokumentaciju na zahtjev životni ciklus , sljedeće datoteke se izvršavaju na početku:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php i njegov Middlewares
  • Service Providers: sadržaj ovog članka

Koji service provider jesu li napunjeni? 

Oni su to defikraja u 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,
 
    ],
 
];

Kao što vidimo, postoji lista service provider nije javno u folderu /vendor, ne bismo ih trebali dirati niti modificirati. Oni koji nas zanimaju su u nastavku, sa BroadcastServicerProvider onemogućeno po defaultu, vjerovatno zato što se rijetko koristi.

Svi ovi provajderi se kreću od vrha do dna, ponavljajući listu dvaput:

  • Prva iteracija traži opcionu metodu register(), korisno za (eventualno) izvršavanje nečega konfiguriranog prije metode boot().
  • druga iteracija izvršava metodu boot() svih provajdera. Opet, jedan po jedan, od vrha do dna, niza 'providers'.
  • Konačno, nakon što su svi dobavljači usluga obrađeni, Laravel prelazi na raščlanjivanje putanje (rute), pokretanje kontrolera, korištenje šablona itd.

Pružatelji usluga Laravel predefiniti

I Service Providers uključeni u Laravel, da li su svi oni prisutni u folderu app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Sve su to PHP klase, svaka povezana sa svojom temom: App, Auth, Broadcasting, Events e Routes. Ali svi imaju jednu zajedničku stvar: metod boot().

Unutar te metode možemo napisati bilo koji kod povezan sa bilo kojim od tih odjeljaka: auth, events, route, itd. Drugim riječima, dobavljači usluga su samo klase za registraciju neke globalne funkcionalnosti.

Oni su odvojeni kao "provajderi" jer se pokreću veoma rano u životnom ciklusu aplikacije, tako da je nešto globalno ovde zgodno pre nego što izvršna skripta dođe do modela ili kontrolera.

Većina funkcionalnosti je u RouteServiceProvideru, evo 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());
        });
    }
}

Ovo je klasa u kojoj su fajlovi konfigurisani routesa routes/web.phproutes/api.php uključeno po defaultudefinita. Imajte na umu da za API postoje i različite konfiguracije: Prefiks krajnje tačke /api i srednji softver api za sve routes.

Možemo uređivati service providers, koji se ne nalaze u folderu /vendor. Prilagođavanje ovih datoteka se vrši kada imate mnogo putanja i želite ih razdvojiti u određene datoteke. Vi kreirate routes/auth.php i stavite putanje tamo, onda "omogućite" tu datoteku u metodi boot() di RouteServiceProvider, samo dodajte treću rečenicu:

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

AppServiceProvider prazan je. Tipičan primjer dodavanja koda AppServiceProvider, odnosi se na onemogućavanje lijenog učitavanja u Eloquentu. Da biste to uradili, samo trebate dodajte dva reda u metodi boot():

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Ovo će izazvati izuzetak ako model odnosa nije učitan.

Stvorite svoj vlastiti service provider prilagođena

Pored pred fajlovadefina kraju, lako možemo kreirati novu Service Provider, vezano za druge teme osim onih predefizavršio kao auth/event/routes.

Prilično tipičan primjer je konfiguracija pogleda Blade. Možemo kreirati direktivu Blade, a zatim dodajte taj kod u metodu boot() bilo kojeg service provider, uključujući zadanu AppServiceProvider. Kreirajmo sada a ViewServiceProvider odvojeno.

Možemo ga generirati ovom naredbom:

php artisan make:provider ViewServiceProvider

Koji će generirati klasu tako predefinavečer:

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

Kao što vidimo unutra postoje dvije metode:

Metoda register().

Metoda register() nam to omogućava defiviše linkova do našeg servisnog kontejnera. Na primjer, u sljedećem kodu:

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

$this->app je globalna varijabla u laravel-u kojoj singleton klasa može pristupiti kroz aplikaciju.

Singleton je karakteristika. Kada primjenjujemo ovu funkciju, obavještavamo aplikaciju da bilo koja klasa koja se prosljeđuje kao parametar u aplikaciji treba imati samo jednu instancu u cijeloj aplikaciji. To znači da će MyClass biti razriješen jednom i da će imati samo jednu instancu kojoj se može pristupiti pomoću varijable my_class.

Metoda boot().

Metoda boot() vam omogućava da pristupite svim uslugama koje su prethodno registrovane pomoću metode registracije. Zatim možete uključiti cijelu uslugu u svoju aplikaciju koristeći ovu metodu.

Vraćajući se na prethodni primjer, uklonimo metodu register() i unutar boot() dodajte kod Blade direktive:

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

Još jedan primjer ViewServiceProvider obzir View Composers, evo isječka sa službene Laravel stranice :

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

Da bi se pokrenuo, ovaj novi provajder mora biti dodan/registriran u nizu provajdera 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

Možda će vas zanimati i:

Inovacijski bilten
Ne propustite najvažnije vijesti o inovacijama. Prijavite se da ih primate putem e-pošte.

Nedavni članak

Britanski antimonopolski regulator podigao je BigTech uzbunu zbog GenAI

UK CMA izdao je upozorenje o ponašanju Big Tech-a na tržištu umjetne inteligencije. Tamo…

18 april 2024

Casa Green: energetska revolucija za održivu budućnost u Italiji

Uredba o „zelenim kućama“, koju je formulisala Evropska unija za poboljšanje energetske efikasnosti zgrada, završila je svoj zakonodavni proces sa…

18 april 2024

Elektronska trgovina u Italiji na +27% prema novom izvještaju Casaleggio Associati

Predstavljen godišnji izvještaj Casaleggio Associati o e-trgovini u Italiji. Izvještaj pod nazivom “AI-Commerce: granice e-trgovine s umjetnom inteligencijom”.…

17 april 2024

Sjajna ideja: Bandalux predstavlja Airpure®, zavjesu koja pročišćava zrak

Rezultat stalnih tehnoloških inovacija i posvećenosti životnoj sredini i dobrobiti ljudi. Bandalux predstavlja Airpure®, šator…

12 april 2024