Artikulo

Mga Service Provider sa Laravel: kung ano sila at kung paano gamitin ang Mga Service Provider sa Laravel

Ang mga service provider ng Laravel ay ang sentral na lugar kung saan inilunsad ang application. Iyon ay, ang mga pangunahing serbisyo ng laravel at mga serbisyo ng aplikasyon, mga klase at ang kanilang mga dependency ay itinutulak sa lalagyan ng serbisyo sa pamamagitan ng mga provider. 

Sa madaling salita, ang mga service provider ay parang funnel kung saan ibinubuhos namin ang "class" na gasolina sa isang tangke na tinatawag na "service container" ng isang makina na tinatawag na Laravel.

halimbawa

Kung bubuksan natin ang config/app.php makakakita tayo ng array na may pangalang "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,
        .
        .
        .
],

Ito ang ilan sa mga service provider na ibinigay kasama ng laravel, ibig sabihin, mga pangunahing serbisyo na inilalagay sa lalagyan ng serbisyo.

Nang i service provider ginaganap ba sila?

Kung titingnan natin ang dokumentasyon lifecycle kapag hiniling , ang mga sumusunod na file ay isinasagawa sa simula:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php at ang kanyang Middlewares
  • Service Providers: nilalaman ng artikulong ito

quali service provider load ba sila? 

Sila ang mga iyon definites sa 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,
 
    ],
 
];

Tulad ng nakikita natin, mayroong isang listahan ng service provider hindi pampubliko sa folder /vendor, hindi natin dapat hawakan o baguhin ang mga ito. Nasa ibaba ang mga interesado sa amin, kasama ang BroadcastServicerProvider hindi pinagana bilang default, marahil dahil ito ay bihirang ginagamit.

Ang lahat ng mga service provider na ito ay tumatakbo mula sa itaas hanggang sa ibaba, na inuulit ang listahan dalawang beses:

  • Ang unang pag-ulit ay naghahanap ng isang opsyonal na paraan register(), kapaki-pakinabang para sa (kalaunan) pagpapatupad ng isang bagay na na-configure bago ang pamamaraan boot().
  • ang pangalawang pag-ulit ay nagpapatupad ng pamamaraan boot() ng lahat ng provider. Muli, isa-isa, itaas hanggang ibaba, ng array 'providers'.
  • Sa wakas, pagkatapos maproseso ang lahat ng mga service provider, nagpapatuloy si Laravel sa pag-parse ng landas (ruta), pagpapatakbo ng controller, gamit ang mga template, atbp.

Mga Tagabigay ng Serbisyo Laravel predefiniti

I Service Providers kasama sa Laravel, ang lahat ng naroroon sa folder app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Lahat sila ay mga klase sa PHP, bawat isa ay nauugnay sa sarili nitong paksa: App, Auth, Broadcasting, Events e Routes. Ngunit lahat sila ay may isang bagay na karaniwan: pamamaraan boot().

Sa loob ng pamamaraang iyon, maaari tayong magsulat ng anumang code na nauugnay sa alinman sa mga seksyong iyon: auth, events, route, atbp. Sa madaling salita, ang mga Service Provider ay mga klase lamang upang magrehistro ng ilang pandaigdigang pag-andar.

Hiwalay sila bilang "provider" dahil napakaaga silang tumatakbo sa lifecycle ng application, kaya isang bagay na pandaigdigan ang maginhawa dito bago mapunta ang executing script sa Mga Modelo o Controller.

Karamihan sa functionality ay nasa RouteServiceProvider, narito ang 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());
        });
    }
}

Ito ang klase kung saan naka-configure ang mga file route, Sa routes/web.phproutes/api.php kasama bilang defaultdefinita. Tandaan na para sa API mayroon ding iba't ibang configuration: Endpoint prefix /api at middleware api para sa lahat routes.

Maaari naming i-edit ang service providers, na wala sa folder /vendor. Ginagawa ang pag-customize sa mga file na ito kapag marami kang mga path at gusto mong paghiwalayin ang mga ito sa mga partikular na file. Lumikha ka routes/auth.php at ilagay ang mga landas doon, pagkatapos ay "paganahin" mo ang file na iyon sa pamamaraan boot() di RouteServiceProvider, idagdag lang ang pangatlong pangungusap:

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

AppServiceProvider ito ay walang laman. Isang tipikal na halimbawa ng pagdaragdag ng code AppServiceProvider, ay tungkol sa hindi pagpapagana ng lazy loading sa Eloquent . Upang gawin ito, kailangan mo lamang magdagdag ng dalawang linya sa pamamaraan boot():

newsletter ng pagbabago
Huwag palampasin ang pinakamahalagang balita sa pagbabago. Mag-sign up upang matanggap ang mga ito sa pamamagitan ng email.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Magbibigay ito ng exception kung hindi na-load ang isang modelo ng relasyon.

Lumikha ng iyong sariling service provider customized

Bilang karagdagan sa mga pre filedefigabi, madali tayong makakagawa ng bago Service Provider, na may kaugnayan sa iba pang mga paksa kaysa sa mga predefinatapos bilang auth/event/routes.

Ang isang medyo karaniwang halimbawa ay ang pagsasaayos ng view Blade. Maaari tayong lumikha ng isang direktiba Blade, at pagkatapos ay idagdag ang code na iyon sa pamamaraan boot() ng alinman service provider, kasama ang default AppServiceProvider. Gumawa tayo ngayon ng a ViewServiceProvider magkahiwalay.

Magagawa natin ito gamit ang command na ito:

php artisan make:provider ViewServiceProvider

Which will generate the class kaya predefigabi:

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

Tulad ng nakikita natin sa loob mayroong dalawang pamamaraan:

Ang register() method

Ang register() method ay nagpapahintulot sa amin na defimga link sa aming lalagyan ng serbisyo. Halimbawa, sa sumusunod na code:

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

Ang $this->app ay isang pandaigdigang variable sa laravel na maaaring ma-access ng singleton class sa pamamagitan ng app.

Singleton ay isang tampok. Kapag inilalapat ang feature na ito, ipinapaalam namin sa application na ang anumang klase na ipinasa bilang parameter sa app ay dapat lang magkaroon ng isang instance sa buong application. Nangangahulugan ito na ang MyClass ay malulutas nang isang beses at magkakaroon lamang ng isang instance, na maaaring ma-access gamit ang my_class variable.

Ang boot() na pamamaraan

Binibigyang-daan ka ng pamamaraang boot() na ma-access ang lahat ng mga serbisyong dati nang nakarehistro gamit ang paraan ng pagrehistro. Maaari mong isama ang buong serbisyo sa iyong aplikasyon gamit ang paraang ito.

Bumalik sa nakaraang halimbawa, alisin natin ang pamamaraan register() at sa loob boot() idagdag ang Blade directive code:

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

Isa pang halimbawa ng ViewServiceProvider pag-aalala nito View Composers, narito ang snippet mula sa opisyal na site ng Laravel :

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

Upang tumakbo, ang bagong provider na ito ay dapat idagdag/irehistro sa 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

Maaari ka ring maging interesado sa:

newsletter ng pagbabago
Huwag palampasin ang pinakamahalagang balita sa pagbabago. Mag-sign up upang matanggap ang mga ito sa pamamagitan ng email.

Kamakailang Mga Artikulo

Pumirma ang mga publisher at OpenAI ng mga kasunduan para i-regulate ang daloy ng impormasyong pinoproseso ng Artificial Intelligence

Noong nakaraang Lunes, inihayag ng Financial Times ang isang deal sa OpenAI. Nilisensyahan ng FT ang world-class na pamamahayag nito...

Abril 30 2024

Mga Online na Pagbabayad: Narito Kung Paano Ka Binabayaran ng Mga Serbisyo ng Streaming Magpakailanman

Milyun-milyong tao ang nagbabayad para sa mga serbisyo ng streaming, na nagbabayad ng buwanang bayad sa subscription. Karaniwang opinyon na ikaw ay…

Abril 29 2024

Itinatampok ng Veeam ang pinakakomprehensibong suporta para sa ransomware, mula sa proteksyon hanggang sa pagtugon at pagbawi

Ang Coveware ng Veeam ay patuloy na magbibigay ng mga serbisyo sa pagtugon sa insidente ng cyber extortion. Mag-aalok ang Coveware ng mga kakayahan sa forensics at remediation...

Abril 23 2024

Green and Digital Revolution: Kung Paano Binabago ng Predictive Maintenance ang Industriya ng Langis at Gas

Binabago ng predictive maintenance ang sektor ng langis at gas, na may makabago at proactive na diskarte sa pamamahala ng halaman.…

Abril 22 2024