Членове

Доставчици на услуги в Laravel: какво представляват и как да използвате доставчици на услуги в Laravel

Доставчиците на услуги на Laravel са централното място, където се стартира приложението. Това означава, че основните услуги на laravel и приложните услуги, класовете и техните зависимости се изтласкват в контейнера за услуги чрез доставчици. 

С други думи, доставчиците на услуги са като фуния, през която наливаме „класово“ гориво в резервоар, наречен „сервизен контейнер“ на двигател, наречен Laravel.

пример

Ако отворим config/app.php ще видим масив с името „доставчик“

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

Това са някои от доставчиците на услуги, предоставени заедно с laravel, т.е. основни услуги, които се поставят в контейнера за услуги.

Когато аз 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'.
  • Накрая, след като всички доставчици на услуги са обработени, Laravel преминава към анализиране на пътя (маршрута), стартиране на контролера, използване на шаблони и т.н.

Доставчици на услуги Laravel predefiнити

I Service Providers включени в Laravel, са всички присъстващи в папката app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Всички те са PHP класове, всеки свързан със своя собствена тема: App, Auth, Broadcasting, Events e Routes. Но всички те имат едно общо нещо: метод boot().

Вътре в този метод можем да напишем всеки код, свързан с който и да е от тези раздели: auth, events, routeи т.н. С други думи, доставчиците на услуги са просто класове за регистриране на някаква глобална функционалност.

Те са отделни като „доставчици“, защото работят много рано в жизнения цикъл на приложението, така че нещо глобално е удобно тук, преди изпълняващият скрипт да стигне до модели или контролери.

По-голямата част от функционалността е в RouteServiceProvider, тук е кодът:

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 и междинен софтуер 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, е за деактивирането на отложеното зареждане в Eloquent. За да направите това, просто трябва добавете два реда в метода boot():

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Това ще хвърли изключение, ако модел на връзка не е зареден.

Създайте свой собствен service provider персонализирано

В допълнение към предварителните файловеdefinites, можем лесно да създадем нов Service Provider, свързани с други теми, различни от предdefiзавършен като auth/event/routes.

Доста типичен пример е конфигурацията на изгледа Blade. Можем да създадем директива Bladeи след това добавете този код в метода boot() от всякакви service provider, включително по подразбиране AppServiceProvider. Нека сега създадем a ViewServiceProvider сепарато.

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

php artisan make:provider ViewServiceProvider

Което ще генерира класа така predefiвечер:

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

Както виждаме вътре има два метода:

Методът register().

Методът register() ни позволява definish връзки към нашия сервизен контейнер. Например в следния код:

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

$this->app е глобална променлива в laravel, до която класът singleton може да има достъп чрез приложението.

Singleton е функция. Когато прилагаме тази функция, ние информираме приложението, че какъвто и клас да бъде предаден като параметър в приложението, трябва да има само един екземпляр в цялото приложение. Това означава, че MyClass ще бъде разрешен веднъж и ще има само един екземпляр, който може да бъде достъпен с помощта на променливата my_class.

Методът boot().

Методът boot() ви позволява да получите достъп до всички услуги, регистрирани преди това чрез метода register. След това можете да включите цялата услуга във вашето приложение, като използвате този метод.

Връщайки се към предишния пример, нека премахнем метода register() и вътре boot() добавете кода на директивата Blade:

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, ето фрагмента от официалния сайт на 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) {
            //
        });
    }
}

За да работи, този нов доставчик трябва да бъде добавен/регистриран в масива на доставчика 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

Може също да се интересувате от:

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.
Tags: SEO

Последни статии

Smart Lock Market: публикуван доклад за пазарно проучване

Терминът Smart Lock Market се отнася до индустрията и екосистемата около производството, разпространението и използването...

Март 27 2024

Какво представляват шаблоните за проектиране: защо да ги използваме, класификация, плюсове и минуси

В софтуерното инженерство моделите на проектиране са оптимални решения на проблеми, които често възникват при проектирането на софтуер. Аз съм като…

Март 26 2024

Технологичната еволюция на индустриалното маркиране

Индустриалното маркиране е широк термин, който обхваща няколко техники, използвани за създаване на трайни маркировки върху повърхността на...

Март 25 2024

Примери за макроси на Excel, написани с VBA

Следните прости примери за макроси в Excel са написани с помощта на VBA Очаквано време за четене: 3 минути Пример...

Март 25 2024

Прочетете Иновация на вашия език

Иновационен бюлетин
Не пропускайте най-важните новини за иновациите. Регистрирайте се, за да ги получавате по имейл.

Следвайте ни