Статті

Постачальники послуг у Laravel: що це таке та як використовувати постачальників послуг у Laravel

I service providers di laravel sono il luogo centrale in cui l’applicazione viene avviata. Cioè, i servizi principali di laravel e i servizi, le classi e le relative dipendenze dell’applicazione vengono inseriti nel contenitore di servizi tramite i provider. 

Іншими словами, постачальники послуг схожі на воронку, через яку ми заливаємо «класове» паливо в резервуар, який називається «сервісним контейнером» двигуна під назвою 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'.
  • Нарешті, після обробки всіх постачальників послуг, 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 включено за замовчуванням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().

Метод register() дозволяє нам це зробити definish посилання на наш сервісний контейнер. Наприклад, у наступному коді:

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

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

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

Для запуску цей новий постачальник має бути доданий/зареєстрований у масиві 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: опубліковано звіт про дослідження ринку

Термін Smart Lock Market стосується галузі та екосистеми, що оточує виробництво, розповсюдження та використання…

27 березня 2024

Що таке шаблони проектування: навіщо їх використовувати, класифікація, плюси і мінуси

У розробці програмного забезпечення шаблони проектування є оптимальним вирішенням проблем, які зазвичай виникають під час проектування програмного забезпечення. Мені подобається…

26 березня 2024

Технологічний розвиток промислового маркування

Промислове маркування — це широкий термін, який охоплює кілька методів, які використовуються для створення стійких позначок на поверхні…

25 березня 2024

Приклади макросів Excel, написаних за допомогою VBA

Наступні прості приклади макросів Excel були написані за допомогою VBA Приблизний час читання: 3 хвилини Приклад…

25 березня 2024

Читайте Innovation своєю мовою

Інноваційний бюлетень
Не пропустіть найважливіші новини про інновації. Підпишіться, щоб отримувати їх електронною поштою.

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