Другими словами, сервис-провайдеры похожи на воронку, через которую мы заливаем «классовое» топливо в бак, называемый «сервисным контейнером» движка под названием 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'
.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.php
e routes/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
Они также могут быть заинтересованы в:
Coveware от Veeam продолжит предоставлять услуги по реагированию на инциденты, связанные с кибер-вымогательством. Coveware предложит возможности криминалистики и исправления…
Прогнозируемое техническое обслуживание производит революцию в нефтегазовом секторе благодаря инновационному и упреждающему подходу к управлению предприятием…
Британское CMA выступило с предупреждением о поведении крупных технологических компаний на рынке искусственного интеллекта. Там…
Указ «Case Green», сформулированный Европейским Союзом для повышения энергоэффективности зданий, завершил законодательный процесс…