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:
Prejšnji ponedeljek je Financial Times objavil dogovor z OpenAI. FT licencira svoje vrhunsko novinarstvo ...
Milijoni ljudi plačujejo storitve pretakanja in plačujejo mesečne naročnine. Splošno mnenje je, da si…
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.…