Med andre ord er serviceudbydere som en tragt, hvorigennem vi hælder "klasse" brændstof i en tank kaldet "servicebeholderen" på en motor kaldet Laravel.
Hvis vi åbner config/app.php vil vi se et array med navnet "udbyder"
'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,
.
.
.
],
Det er nogle af de serviceudbydere, der leveres sammen med laravel, det vil sige basistjenester, som er placeret i servicecontaineren.
service provider
udføres de?Hvis vi ser på dokumentationen på forespørgsel livscyklus , udføres følgende filer i starten:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
og hans Middlewares
Service Providers
: indholdet af denne artikelkvali service provider
er de indlæst?
Det er dem definites i arrayet 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,
],
];
Som vi kan se, er der en liste over service provider
ikke offentlig i mappen /vendor
, vi bør hverken røre ved eller ændre dem. Dem, der interesserer os, er nedenfor, med BroadcastServicerProvider
deaktiveret som standard, sandsynligvis fordi den sjældent bruges.
Alle disse tjenesteudbydere kører fra top til bund og gentager listen to gange:
register()
, nyttig til (til sidst) at udføre noget, der er konfigureret før metoden boot()
.boot()
af alle udbydere. Igen, en efter en, top til bund, af arrayet 'providers'
.I Service Providers
inkluderet i Laravel, er alle tilstedeværende i mappen app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
De er alle PHP-klasser, hver relateret til sit eget emne: App
, Auth
, Broadcasting
, Events
e Routes
. Men de har alle én ting til fælles: metode boot()
.
Inde i denne metode kan vi skrive enhver kode, der er relateret til en af disse sektioner: auth
, events
, route
, etc. Med andre ord er tjenesteudbydere kun klasser til at registrere noget global funktionalitet.
De er adskilte som "udbydere", fordi de kører meget tidligt i applikationens livscyklus, så noget globalt er praktisk her, før det eksekverende script kommer til modeller eller controllere.
Det meste af funktionaliteten er i RouteServiceProvider, her er koden:
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());
});
}
}
Dette er klassen, hvor filerne er konfigureret route
, Med routes/web.php
e routes/api.php
inkluderet som standarddefinita. Bemærk, at for API'en er der også forskellige konfigurationer: Endpoint-præfiks /api
og middleware api
for alle routes
.
Vi kan redigere service providers
, som ikke er i mappen /vendor
. Tilpasning af disse filer udføres, når du har mange stier og ønsker at adskille dem i specifikke filer. Du skaber routes/auth.php
og læg stierne der, så "aktiverer" du den fil i metoden boot()
di RouteServiceProvider
, tilføj blot den tredje sætning:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
den er tom. Et typisk eksempel på tilføjelse af kode AppServiceProvider
, handler om at deaktivere doven indlæsning i Eloquent . For at gøre dette behøver du bare tilføje to linjer i metoden boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Dette vil give en undtagelse, hvis en relationsmodel ikke er indlæst.
service provider
tilpassetUd over pre-filernedefinites, kan vi nemt oprette en ny Service Provider
, relateret til andre emner end de førdefifærdig som auth
/event
/routes
.
Et ret typisk eksempel er visningskonfigurationen Blade
. Vi kan lave et direktiv Blade
, og tilføj derefter denne kode i metoden boot(
) af enhver service provider
, inklusive standard AppServiceProvider
. Lad os nu skabe en ViewServiceProvider
separator.
Vi kan generere det med denne kommando:
php artisan make:provider ViewServiceProvider
Hvilket vil generere klassen så predefiaften:
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()
{
//
}
}
Som vi kan se indeni er der to metoder:
Register()-metoden giver os mulighed for definish links til vores servicecontainer. For eksempel i følgende kode:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app er en global variabel i laravel, som en singleton-klasse kan få adgang til via appen.
Singleton er en funktion. Når vi anvender denne funktion, informerer vi applikationen om, at uanset hvilken klasse, der sendes som en parameter i appen, kun skal have én forekomst i hele applikationen. Det betyder, at MyClass vil blive løst én gang og kun vil have én instans, som kan tilgås ved hjælp af my_class-variablen.
Boot()-metoden giver dig adgang til alle tjenester, der tidligere er registreret ved hjælp af registermetoden. Du kan derefter inkludere hele tjenesten i din ansøgning ved hjælp af denne metode.
Går tilbage til det forrige eksempel, lad os fjerne metoden register()
og indeni boot()
tilføj Blade-direktivkoden:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Endnu et eksempel på ViewServiceProvider
det angår View Composers
, her er uddraget fra den officielle Laravel-side :
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) {
//
});
}
}
For at køre, skal denne nye udbyder tilføjes/registreres til udbyderens array 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
Du kan også være interesseret i:
Flådesektoren er en sand global økonomisk magt, som har navigeret mod et 150 milliarder marked...
Sidste mandag offentliggjorde Financial Times en aftale med OpenAI. FT licenserer sin verdensklasses journalistik...
Millioner af mennesker betaler for streamingtjenester og betaler månedlige abonnementsgebyrer. Det er almindelig opfattelse, at du...
Coveware by Veeam vil fortsætte med at levere responstjenester til cyberafpresning. Coveware vil tilbyde kriminaltekniske og afhjælpende funktioner...