товары

Поставщики услуг в 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, con  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 обычай

В дополнение к предварительным файлам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()
    {
        //
    }
}

Как мы видим внутри, есть два метода:

Метод регистрации()

Метод register() позволяет нам defiЗавершите ссылки на наш сервисный контейнер. Например, в следующем коде:

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

$this->app — это глобальная переменная в laravel, к которой одноэлементный класс может получить доступ через приложение.

Синглтон — это фича. При применении этой функции мы информируем приложение о том, что любой класс, передаваемый в качестве параметра в приложении, должен иметь только один экземпляр во всем приложении. Это означает, что MyClass будет разрешен один раз и будет иметь только один экземпляр, доступ к которому можно получить с помощью переменной my_class.

Метод загрузки()

Метод 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

Они также могут быть заинтересованы в:

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

АРТИКОЛИ recenti

Veeam предлагает наиболее полную поддержку программ-вымогателей: от защиты до реагирования и восстановления.

Coveware от Veeam продолжит предоставлять услуги по реагированию на инциденты, связанные с кибер-вымогательством. Coveware предложит возможности криминалистики и исправления…

Апрель 23 2024

Зеленая и цифровая революция: как прогнозируемое обслуживание меняет нефтегазовую отрасль

Прогнозируемое техническое обслуживание производит революцию в нефтегазовом секторе благодаря инновационному и упреждающему подходу к управлению предприятием…

Апрель 22 2024

Антимонопольный регулятор Великобритании поднял тревогу BigTech по поводу GenAI

Британское CMA выступило с предупреждением о поведении крупных технологических компаний на рынке искусственного интеллекта. Там…

Апрель 18 2024

Casa Green: энергетическая революция для устойчивого будущего в Италии

Указ «Case Green», сформулированный Европейским Союзом для повышения энергоэффективности зданий, завершил законодательный процесс…

Апрель 18 2024

Читайте «Инновации» на вашем языке

Инновационный бюллетень
Не пропустите самые важные новости об инновациях. Зарегистрируйтесь, чтобы получать их по электронной почте.

Следуйте за нами