Чланци

Добављачи услуга у Ларавел-у: шта су и како користити добављаче услуга у Ларавел-у

Ларавел провајдери услуга су централно место где се апликација покреће. То јест, основне Ларавел услуге и сервиси апликација, класе и њихове зависности се стављају у контејнер услуге преко провајдера. 

Другим речима, пружаоци услуга су као левак кроз који сипамо гориво „класе” у резервоар који се зове „сервисни контејнер” мотора који се зове Ларавел.

пример

Ако отворимо цонфиг/апп.пхп, видећемо низ са именом "провајдер"

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

Ово су неки од провајдера услуга који се пружају заједно са ларавел-ом, односно основним сервисима који су смештени у сервисни контејнер.

Куандо и service provider да ли се изводе?

Ако погледамо документацију на захтев животног циклуса , следеће датотеке се извршавају на почетку:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php и његов Middlewares
  • Service Providers: садржај овог чланка

Који service provider да ли су напуњени? 

То су они defiкраја у низу 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,
 
    ],
 
];

Као што видимо, постоји листа service provider није јавно у фасцикли /vendor, не треба да их дирамо нити мењамо. Они који нас занимају су у наставку, са BroadcastServicerProvider подразумевано онемогућен, вероватно зато што се ретко користи.

Сви ови провајдери услуга иду од врха до дна, понављајући листу два пута:

  • Прва итерација тражи опциони метод register(), корисно за (евентуално) извршавање нечега конфигурисаног пре методе boot().
  • друга итерација извршава метод boot() свих провајдера. Опет, један по један, од врха до дна, низа 'providers'.
  • Коначно, након што су сви добављачи услуга обрађени, Ларавел прелази на рашчлањивање путање (руте), покретање контролера, коришћење шаблона итд.

Добављачи услуга Ларавел преdefiнити

I Service Providers укључени у Ларавел, да ли су сви они присутни у фасцикли app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Све су то ПХП класе, свака повезана са својом темом: App, Auth, Broadcasting, Events e Routes. Али сви имају једну заједничку ствар: метод boot().

Унутар те методе можемо написати било који код који се односи на било који од ових одељака: auth, events, route, итд. Другим речима, добављачи услуга су само класе за регистровање неке глобалне функционалности.

Они су одвојени као „провајдери“ јер се покрећу веома рано у животном циклусу апликације, тако да је нешто глобално овде згодно пре него што извршна скрипта дође до модела или контролера.

Већина функционалности је у РоутеСервицеПровидер, ево кода:

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

Ово је класа у којој су датотеке конфигурисане route, Са routes/web.phproutes/api.php подразумевано укљученоdefiнита. Имајте на уму да за АПИ постоје и различите конфигурације: Префикс крајње тачке /api и средњи софтвер api за све routes.

Можемо да уредимо service providers, који се не налазе у фасцикли /vendor. Прилагођавање ових датотека се врши када имате много путања и желите да их раздвојите у одређене датотеке. Ви стварате routes/auth.php и ставите путање тамо, онда "омогућите" ту датотеку у методу boot() di RouteServiceProvider, само додајте трећу реченицу:

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

AppServiceProvider празно је. Типичан пример додавања кода AppServiceProvider, говори о онемогућавању лењог учитавања у Елокуент-у. Да бисте то урадили, само требате додајте два реда у методу boot():

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Ово ће изазвати изузетак ако модел односа није учитан.

Створи сопствени service provider обичај

Поред пред фајловаdefiните, лако можемо створити нову Service Provider, везано за друге теме осим оних преdefiзавршио као auth/event/routes.

Прилично типичан пример је конфигурација приказа Blade. Можемо направити директиву Blade, а затим додајте тај код у метод boot() било service provider, укључујући подразумевани AppServiceProvider. Хајде сада да направимо а ViewServiceProvider сепарато.

Можемо га генерисати овом командом:

php artisan make:provider ViewServiceProvider

Који ће генерисати класу тако преdefiноћ:

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

Као што видимо унутра постоје две методе:

Метод регистер().

Метод регистер() нам омогућава да defiвише линкова до нашег контејнера за услуге. На пример, у следећем коду:

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

$тхис->апп је глобална варијабла у ларавел-у којој синглетон класа може да приступи преко апликације.

Синглтон је карактеристика. Када примењујемо ову функцију, обавештавамо апликацију да било која класа која се проследи као параметар у апликацији треба да има само једну инстанцу у целој апликацији. То значи да ће МиЦласс бити разрешен једном и да ће имати само једну инстанцу којој се може приступити помоћу променљиве ми_цласс.

Метода боот().

Метода боот() вам омогућава да приступите свим услугама које су претходно регистроване помоћу методе регистра. Затим можете укључити целу услугу у своју апликацију користећи овај метод.

Враћајући се на претходни пример, хајде да уклонимо метод register() и унутар boot() додајте код Бладе директиве:

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

Још један пример ViewServiceProvider подразумева View Composers, ево исечка са званичног сајта Ларавел :

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

Да би се покренуо, овај нови провајдер мора бити додат/регистрован у низ провајдера 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

Можда ће вас занимати и:

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Недавни чланци

Будућност је ту: Како бродарска индустрија револуционише глобалну економију

Поморски сектор је права глобална економска сила, која је кренула ка тржишту од 150 милијарди...

КСНУМКС Мај КСНУМКС

Издавачи и ОпенАИ потписују уговоре за регулисање протока информација које обрађује вештачка интелигенција

Прошлог понедељка, Финанциал Тимес је објавио договор са ОпенАИ. ФТ лиценцира своје новинарство светске класе…

КСНУМКС април КСНУМКС

Онлине плаћања: Ево како вас услуге стримовања чине да плаћате заувек

Милиони људи плаћају услуге стриминга, плаћајући месечне претплате. Увријежено је мишљење да сте…

КСНУМКС април КСНУМКС

Вееам има најсвеобухватнију подршку за рансомваре, од заштите до одговора и опоравка

Цовеваре од Вееам-а ће наставити да пружа услуге одговора на инциденте са сајбер изнудом. Цовеваре ће понудити форензику и могућности санације…

КСНУМКС април КСНУМКС

Прочитајте Иновације на свом језику

Иновациони билтен
Не пропустите најважније вести о иновацијама. Пријавите се да их примате путем е-поште.

Пратите нас