towary

Dostawcy usług w Laravel: czym są i jak korzystać z usługodawców w Laravel

Dostawcy usług Laravel są centralnym miejscem uruchamiania aplikacji. Oznacza to, że podstawowe usługi laravel i usługi aplikacyjne, klasy i ich zależności są wypychane do kontenera usług za pośrednictwem dostawców. 

Innymi słowy usługodawcy są jak lejek, przez który wlewamy „klasowe” paliwo do zbiornika zwanego „kontenerem serwisowym” silnika o nazwie Laravel.

przykład

Jeśli otworzymy config/app.php zobaczymy tablicę o nazwie „dostawca”

'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,
        .
        .
        .
],

To tylko niektórzy dostawcy usług dostarczanych wraz z laravel, czyli podstawowymi usługami, które są umieszczane w kontenerze usług.

Kiedy ja service provider czy są wykonywane?

Jeśli spojrzymy na dokumentację cykl życia na żądanie , na początku uruchamiane są następujące pliki:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php i jego Middlewares
  • Service Providers: treść tego artykułu

kwalifikacje service provider są załadowane? 

Oni są tymi definity w tablicy 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,
 
    ],
 
];

Jak widzimy, istnieje lista service provider niepubliczne w folderze /vendor, nie powinniśmy ich dotykać ani modyfikować. Te, które nas interesują, znajdują się poniżej, z BroadcastServicerProvider domyślnie wyłączona, prawdopodobnie dlatego, że jest rzadko używana.

Wszyscy ci usługodawcy działają od góry do dołu, powtarzając listę dwa razy:

  • Pierwsza iteracja szuka opcjonalnej metody register(), przydatne do (ostatecznego) wykonania czegoś skonfigurowanego przed metodą boot().
  • druga iteracja wykonuje metodę boot() wszystkich dostawców. Ponownie, jeden po drugim, od góry do dołu tablicy 'providers'.
  • Wreszcie, po przetworzeniu wszystkich dostawców usług, Laravel przechodzi do parsowania ścieżki (trasy), uruchomienia kontrolera, użycia szablonów itp.

Dostawcy usług Laravel predefiNiti

I Service Providers zawarte w Laravel, to wszystkie obecne w folderze app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Wszystkie są klasami PHP, każda związana z własnym tematem: App, Auth, Broadcasting, Events e Routes. Ale wszystkie mają jedną wspólną cechę: metodę boot().

Wewnątrz tej metody możemy napisać dowolny kod związany z dowolną z tych sekcji: auth, events, routeitp. Innymi słowy, dostawcy usług to tylko klasy rejestrujące niektóre globalne funkcje.

Są oddzielni jako „dostawcy”, ponieważ działają na bardzo wczesnym etapie cyklu życia aplikacji, więc coś globalnego jest tutaj wygodne, zanim skrypt wykonawczy dotrze do modeli lub kontrolerów.

Większość funkcji znajduje się w RouteServiceProvider, oto kod:

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());
        });
    }
}

Jest to klasa, w której konfigurowane są pliki route, Z routes/web.phproutes/api.php dołączone domyślniedefinita. Należy pamiętać, że dla interfejsu API istnieją również różne konfiguracje: Prefiks punktu końcowego /api i oprogramowania pośredniego api dla wszystkich routes.

Możemy edytować tzw service providers, których nie ma w folderze /vendor. Dostosowywanie tych plików odbywa się, gdy masz wiele ścieżek i chcesz je rozdzielić na określone pliki. Tworzysz routes/auth.php i umieść tam ścieżki, a następnie „włącz” ten plik w metodzie boot() di RouteServiceProvider, wystarczy dodać trzecie zdanie:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider to jest puste. Typowy przykład dodawania kodu AppServiceProvider, dotyczy wyłączenia leniwego ładowania w Eloquent . Aby to zrobić, wystarczy dodaj dwie linie w metodzie boot():

Biuletyn innowacji
Nie przegap najważniejszych wiadomości dotyczących innowacji. Zarejestruj się, aby otrzymywać je e-mailem.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Spowoduje to zgłoszenie wyjątku, jeśli model relacji nie zostanie załadowany.

Stwórz swój własny service provider dostosowane

Oprócz plików wstępnychdefinites, możemy łatwo utworzyć nowy Service Provider, związane z innymi tematami niż te przeddefiskończył jako auth/event/routes.

Dość typowym przykładem jest konfiguracja widoku Blade. Możemy stworzyć dyrektywę Blade, a następnie Dodaj ten kod do metody boot() o żadnym service provider, w tym domyślne AppServiceProvider. Stwórzmy teraz a ViewServiceProvider separacja.

Możemy go wygenerować za pomocą tego polecenia:

php artisan make:provider ViewServiceProvider

Który wygeneruje klasę tak predefinoc:

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

Jak widzimy w środku, istnieją dwie metody:

Metoda register().

Pozwala nam na to metoda register(). defizakończ linki do naszego kontenera usług. Na przykład w poniższym kodzie:

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

$this->app to globalna zmienna w laravel, do której klasa singleton może uzyskać dostęp za pośrednictwem aplikacji.

Singleton to funkcja. Stosując tę ​​funkcję informujemy aplikację, że każda klasa przekazana jako parametr w aplikacji powinna mieć tylko jedną instancję w całej aplikacji. Oznacza to, że MyClass zostanie rozwiązany raz i będzie miał tylko jedną instancję, do której można uzyskać dostęp za pomocą zmiennej my_class.

Metoda boot().

Metoda boot() umożliwia dostęp do wszystkich usług zarejestrowanych wcześniej przy użyciu metody register. Następnie możesz uwzględnić całą usługę w swojej aplikacji za pomocą tej metody.

Wracając do poprzedniego przykładu, usuńmy metodę register() i wewnątrz boot() dodaj kod dyrektywy Blade:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Inny przykład ViewServiceProvider pozdrowienia View Composers, oto fragment z oficjalnej strony Laravela :

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

Aby uruchomić, ten nowy dostawca musi zostać dodany/zarejestrowany w tablicy dostawców 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

Mogą być także zainteresowani:

Biuletyn innowacji
Nie przegap najważniejszych wiadomości dotyczących innowacji. Zarejestruj się, aby otrzymywać je e-mailem.

Najnowsze artykuły

Veeam oferuje najbardziej wszechstronną obsługę oprogramowania ransomware, od ochrony po reagowanie i odzyskiwanie

Coveware by Veeam będzie w dalszym ciągu świadczyć usługi reagowania na incydenty związane z wyłudzeniami cybernetycznymi. Coveware będzie oferować funkcje kryminalistyczne i naprawcze…

Kwiecień 23 2024

Rewolucja ekologiczna i cyfrowa: jak konserwacja predykcyjna zmienia przemysł naftowy i gazowy

Konserwacja predykcyjna rewolucjonizuje sektor naftowo-gazowy dzięki innowacyjnemu i proaktywnemu podejściu do zarządzania zakładami.…

Kwiecień 22 2024

Brytyjski organ antymonopolowy podnosi alarm BigTech w związku z GenAI

Brytyjskie CMA wydało ostrzeżenie dotyczące zachowań Big Tech na rynku sztucznej inteligencji. Tam…

Kwiecień 18 2024

Casa Green: rewolucja energetyczna dla zrównoważonej przyszłości we Włoszech

Rozporządzenie w sprawie zielonych domów, opracowane przez Unię Europejską w celu zwiększenia efektywności energetycznej budynków, zakończyło proces legislacyjny…

Kwiecień 18 2024