Innymi słowy usługodawcy są jak lejek, przez który wlewamy „klasowe” paliwo do zbiornika zwanego „kontenerem serwisowym” silnika o nazwie Laravel.
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.
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łukwalifikacje 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:
register()
, przydatne do (ostatecznego) wykonania czegoś skonfigurowanego przed metodą boot()
.boot()
wszystkich dostawców. Ponownie, jeden po drugim, od góry do dołu tablicy 'providers'
.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
, route
itp. 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.php
e routes/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()
:
// 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.
service provider
dostosowaneOpró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:
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() 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:
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…
Konserwacja predykcyjna rewolucjonizuje sektor naftowo-gazowy dzięki innowacyjnemu i proaktywnemu podejściu do zarządzania zakładami.…
Brytyjskie CMA wydało ostrzeżenie dotyczące zachowań Big Tech na rynku sztucznej inteligencji. Tam…
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…