Alivorte, servoprovizantoj estas kiel funelo tra kiu ni verŝas "klasan" fuelon en tankon nomatan "servujo" de motoro nomita Laravel.
Se ni malfermas config/app.php ni vidos tabelon kun la nomo "provizanto"
'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,
.
.
.
],
Ĉi tiuj estas kelkaj el la servaj provizantoj kune kun laravel, t.e. bazaj servoj, kiuj estas metitaj en la servan ujo.
service provider
ĉu ili estas faritaj?Se ni rigardas la dokumentadon laŭ peto vivociklo , la sekvaj dosieroj estas ekzekutitaj komence:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
kaj lia Middlewares
Service Providers
: enhavo de ĉi tiu artikoloKvali service provider
ĉu ili estas ŝarĝitaj?
Ili estas tiuj definits en la tabelo 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,
],
];
Kiel ni povas vidi, estas listo de service provider
ne publika en la dosierujo /vendor
, ni devas nek tuŝi nek modifi ilin. Tiuj, kiuj interesas nin, estas sube, kun BroadcastServicerProvider
malebligita defaŭlte, verŝajne ĉar ĝi estas malofte uzata.
Ĉiuj ĉi tiuj servaj provizantoj kuras de supre al sube, ripetante la liston dufoje:
register()
, utila por (eventuale) ekzekuti ion agorditan antaŭ la metodo boot()
.boot()
de ĉiuj provizantoj. Denove, unu post alia, de supre al malsupre, de la tabelo 'providers'
.I Service Providers
inkluzivitaj en Laravel, estas ĉiuj ĉeestantoj en la dosierujo app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Ili estas ĉiuj PHP-klasoj, ĉiu rilata al sia propra temo: App
, Auth
, Broadcasting
, Events
e Routes
. Sed ili ĉiuj havas unu komunan aferon: metodo boot()
.
Ene de tiu metodo, ni povas skribi ajnan kodon rilatan al iu el tiuj sekcioj: auth
, events
, route
, ktp. Alivorte, Servaj Provizantoj estas nur klasoj por registri iun tutmondan funkciecon.
Ili estas apartaj kiel "provizantoj" ĉar ili funkcias tre frue en la aplikaĵa vivociklo, do io tutmonda estas oportuna ĉi tie antaŭ ol la ekzekuta skripto atingas Modelojn aŭ Regilojn.
Plejparto de la funkcio estas en la RouteServiceProvider, jen la kodo:
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());
});
}
}
Ĉi tiu estas la klaso kie la dosieroj estas agordita route
kun routes/web.php
e routes/api.php
inkluzivita defaŭltedefinita. Notu, ke por la API ekzistas ankaŭ malsamaj agordoj: Finpunkto-prefikso /api
kaj mezvaro api
por ĉiuj routes
.
Ni povas redakti la service providers
, kiuj ne estas en la dosierujo /vendor
. Agordo de ĉi tiuj dosieroj estas farita kiam vi havas multajn vojojn kaj volas apartigi ilin en specifajn dosierojn. Vi kreas routes/auth.php
kaj metu la vojojn tien, tiam vi "aktivigas" tiun dosieron en la metodo boot()
di RouteServiceProvider
, nur aldonu la trian frazon:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
ĝi estas malplena. Tipa ekzemplo de aldono de kodo AppServiceProvider
, temas pri malfunkciigado de maldiligenta ŝarĝo en Elokvent . Por fari tion, vi nur bezonas aldonu du liniojn en la metodo boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Ĉi tio ĵetos escepton se rilatmodelo ne estas ŝarĝita.
service provider
adaptitajnKrom la pre dosierojdefinotojn, ni povas facile krei novan Service Provider
, rilataj al aliaj temoj ol tiuj predefifinis kiel auth
/event
/routes
.
Sufiĉe tipa ekzemplo estas la vidkonfiguracio Blade
. Ni povas krei direktivon Blade
, kaj poste aldonu tiun kodon en la metodon boot(
) de iu ajn service provider
, inkluzive de la defaŭlta AppServiceProvider
. Ni nun kreu a ViewServiceProvider
aparta.
Ni povas generi ĝin per ĉi tiu komando:
php artisan make:provider ViewServiceProvider
Kiu generos la klason tiel predefinokto:
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()
{
//
}
}
Kiel ni povas vidi interne, estas du metodoj:
La metodo register() permesas al ni defifini ligilojn al nia serva ujo. Ekzemple, en la sekva kodo:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app estas tutmonda variablo en laravel, kiun singleton klaso povas aliri per la app.
Singleton estas trajto. Kiam ni aplikas ĉi tiun funkcion, ni informas la aplikaĵon, ke kia ajn klaso estas pasigita kiel parametro en la aplikaĵo devus havi nur unu okazon en la tuta aplikaĵo. Ĉi tio signifas, ke MyClass estos solvita unufoje kaj havos nur unu kazon, kiun oni povas aliri uzante la variablon my_class.
La metodo boot() permesas al vi aliri ĉiujn servojn antaŭe registritajn per la registra metodo. Vi povas tiam inkluzivi la tutan servon en via aplikaĵo uzante ĉi tiun metodon.
Revenante al la antaŭa ekzemplo, ni forigu la metodon register()
kaj interne boot()
aldonu la Blade-direktivkodon:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Alia ekzemplo de ViewServiceProvider
konsidero View Composers
, jen la fragmento de la oficiala Laravel-ejo :
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) {
//
});
}
}
Por funkcii, ĉi tiu nova provizanto devas esti aldonita/registrita al la en provizanta tabelo 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
Vi ankaŭ povas interesiĝi pri:
La maramea sektoro estas vera tutmonda ekonomia potenco, kiu navigis al merkato de 150 miliardoj...
Pasintlunde, la Financial Times anoncis interkonsenton kun OpenAI. FT licencas sian mondklasan ĵurnalismon...
Milionoj da homoj pagas por streaming-servoj, pagante monatajn abonkotizojn. Estas komuna opinio, ke vi...
Coveware de Veeam daŭre liveros servojn de respondaj incidentoj pri ciberĉantaĝo. Coveware ofertos krimmedicinajn kaj solvajn kapablojn...