С други думи, доставчиците на услуги са като фуния, през която наливаме „класово“ гориво в резервоар, наречен „сервизен контейнер“ на двигател, наречен 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
С 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
персонализираноВ допълнение към предварителните файлове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() ни позволява definish връзки към нашия сервизен контейнер. Например в следния код:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app е глобална променлива в laravel, до която класът singleton може да има достъп чрез приложението.
Singleton е функция. Когато прилагаме тази функция, ние информираме приложението, че какъвто и клас да бъде предаден като параметър в приложението, трябва да има само един екземпляр в цялото приложение. Това означава, че 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
Може също да се интересувате от:
Терминът Smart Lock Market се отнася до индустрията и екосистемата около производството, разпространението и използването...
В софтуерното инженерство моделите на проектиране са оптимални решения на проблеми, които често възникват при проектирането на софтуер. Аз съм като…
Индустриалното маркиране е широк термин, който обхваща няколко техники, използвани за създаване на трайни маркировки върху повърхността на...
Следните прости примери за макроси в Excel са написани с помощта на VBA Очаквано време за четене: 3 минути Пример...