Z drugimi besedami, ponudniki storitev so kot lijak, skozi katerega pretakamo "razredno" gorivo v rezervoar, imenovan "servisni kontejner" motorja, imenovanega Laravel.
Če odpremo config/app.php, bomo videli polje z imenom "ponudnik"
'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 so nekateri ponudniki storitev, ki so na voljo skupaj z laravelom, tj. osnovne storitve, ki so nameščene v storitvenem vsebniku.
service provider
se izvajajo?Če pogledamo dokumentacijo na zahtevo življenjski cikel , se na začetku izvedejo naslednje datoteke:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
in njegovo Middlewares
Service Providers
: vsebina tega člankaocenju service provider
so naložene?
Oni so tisti definite v nizu 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,
],
];
Kot lahko vidimo, obstaja seznam service provider
ni javno v mapi /vendor
, se jih ne smemo niti dotikati niti spreminjati. Tisti, ki nas zanimajo, so spodaj, z BroadcastServicerProvider
privzeto onemogočeno, verjetno zato, ker se redko uporablja.
Vsi ti ponudniki storitev potekajo od zgoraj navzdol in ponavljajo seznam dvakrat:
register()
, uporabno za (končno) izvajanje nečesa, kar je bilo konfigurirano pred metodo boot()
.boot()
vseh ponudnikov. Spet enega za drugim, od vrha do dna niza 'providers'
.I Service Providers
vključeni v Laravel, so vsi prisotni v mapi app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Vsi so razredi PHP, vsak povezan s svojo temo: App
, Auth
, Broadcasting
, Events
e Routes
. Vsem pa je skupno eno: metoda boot()
.
Znotraj te metode lahko napišemo katero koli kodo, povezano s katerim koli od teh razdelkov: auth
, events
, route
itd. Z drugimi besedami, ponudniki storitev so samo razredi za registracijo nekaterih globalnih funkcij.
Ločeni so kot "ponudniki", ker se izvajajo zelo zgodaj v življenjskem ciklu aplikacije, zato je nekaj globalnega primernega tukaj, preden izvajalni skript pride do modelov ali krmilnikov.
Večina funkcionalnosti je v RouteServiceProvider, tukaj je koda:
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());
});
}
}
To je razred, v katerem so konfigurirane datoteke route
, Z routes/web.php
e routes/api.php
vključeno privzetodefinita. Upoštevajte, da za API obstajajo tudi različne konfiguracije: Predpona končne točke /api
in vmesno programsko opremo api
za vse routes
.
Lahko uredimo service providers
, ki jih ni v mapi /vendor
. Te datoteke prilagodite po meri, ko imate veliko poti in jih želite ločiti v določene datoteke. Vi ustvarjate routes/auth.php
in tam vnesete poti, potem to datoteko "omogočite" v metodi boot()
di RouteServiceProvider
, samo dodajte tretji stavek:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
prazen je. Tipičen primer dodajanja kode AppServiceProvider
, govori o onemogočanju lenega nalaganja v Eloquentu. Če želite to narediti, potrebujete le dodajte dve vrstici v metodi boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
To bo povzročilo izjemo, če model razmerja ni naložen.
service provider
prilagodiliPoleg pred datotekdefinites, lahko preprosto ustvarimo novega Service Provider
, povezanih z drugimi temami kot s tistimi preddefikončal kot auth
/event
/routes
.
Dokaj tipičen primer je konfiguracija pogleda Blade
. Ustvarimo lahko direktivo Blade
in nato dodajte to kodo v metodo boot(
) katerega koli service provider
, vključno s privzetim AppServiceProvider
. Ustvarimo zdaj a ViewServiceProvider
ločiti.
Ustvarimo ga lahko s tem ukazom:
php artisan make:provider ViewServiceProvider
Kar bo ustvarilo razred tako predefinoč:
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()
{
//
}
}
Kot lahko vidimo, obstajata dva načina:
Metoda register() nam omogoča definish povezave do našega servisnega vsebnika. Na primer v naslednji kodi:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app je globalna spremenljivka v laravel, do katere lahko razred singleton dostopa prek aplikacije.
Singleton je funkcija. Pri uporabi te funkcije obveščamo aplikacijo, da mora imeti kateri koli razred, ki je v aplikaciji posredovan kot parameter, samo en primerek v celotni aplikaciji. To pomeni, da bo MyClass razrešen enkrat in bo imel samo en primerek, do katerega lahko dostopate s spremenljivko my_class.
Metoda boot() vam omogoča dostop do vseh storitev, ki ste jih predhodno registrirali z metodo register. S to metodo lahko nato v svojo aplikacijo vključite celotno storitev.
Če se vrnemo k prejšnjemu primeru, odstranimo metodo register()
in znotraj boot()
dodajte kodo direktive Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Še en primer ViewServiceProvider
zadeva View Composers
, tukaj je delček z uradne strani 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) {
//
});
}
}
Za zagon je treba tega novega ponudnika dodati/registrirati v matriko ponudnikov 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
Morda vas bo zanimalo tudi:
Coveware by Veeam bo še naprej zagotavljal storitve odzivanja na incidente kibernetskega izsiljevanja. Coveware bo nudil forenziko in zmogljivosti sanacije ...
Prediktivno vzdrževanje revolucionira sektor nafte in plina z inovativnim in proaktivnim pristopom k upravljanju obratov.…
Britanski CMA je izdal opozorilo glede obnašanja Big Tech na trgu umetne inteligence. tam …
Odlok "Case Green", ki ga je oblikovala Evropska unija za povečanje energetske učinkovitosti stavb, je zaključil svoj zakonodajni postopek z ...