Іншими словами, постачальники послуг схожі на воронку, через яку ми заливаємо «класове» паливо в резервуар, який називається «сервісним контейнером» двигуна під назвою Laravel.
Якщо ми відкриємо config/app.php, ми побачимо масив із назвою «provider»
'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
включено за замовчуваннямdefinita. Зверніть увагу, що для 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
. Давайте тепер створимо 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 - це функція. Застосовуючи цю функцію, ми повідомляємо програмі, що будь-який клас, який передається як параметр у програмі, повинен мати лише один екземпляр у всій програмі. Це означає, що 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) {
//
});
}
}
Для запуску цей новий постачальник має бути доданий/зареєстрований у масиві in provider 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 хвилини Приклад…