Статті

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

Постачальники послуг Laravel є центральним місцем, де запускається програма. Тобто основні служби Laravel і служби додатків, класи та їхні залежності розміщуються в контейнері послуг через постачальників. 

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

Вас також можуть зацікавити:

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

Останні статті

Інноваційне втручання в доповнену реальність із програмою перегляду Apple у поліклініці Катанії

У поліклініці Катанії проведено операцію офтальмопластики за допомогою комерційного переглядача Apple Vision Pro…

3 травня 2024

Переваги розмальовок для дітей - чарівний світ для будь-якого віку

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

2 травня 2024

Майбутнє тут: як індустрія судноплавства революціонізує світову економіку

Військово-морський сектор є справжньою глобальною економічною силою, яка просунулася до 150-мільярдного ринку...

1 травня 2024

Видавці та OpenAI підписують угоди щодо регулювання потоку інформації, яка обробляється штучним інтелектом

Минулого понеділка Financial Times оголосила про угоду з OpenAI. FT ліцензує свою журналістику світового рівня…

Квітень 30 2024

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

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

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