Citiem vārdiem sakot, pakalpojumu sniedzēji ir kā piltuve, caur kuru mēs ielejam "klases" degvielu tvertnē, ko sauc par "servisa konteineru" dzinējam ar nosaukumu Laravel.
Atverot config/app.php, mēs redzēsim masīvu ar nosaukumu "provider"
'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,
.
.
.
],
Tie ir daži no pakalpojumu sniedzējiem, kas tiek nodrošināti kopā ar laravel, t.i., pamatpakalpojumi, kas tiek ievietoti pakalpojumu konteinerā.
service provider
vai tās tiek veiktas?Ja skatāmies uz dokumentāciju pēc pieprasījuma dzīves cikls , sākumā tiek palaisti šādi faili:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
un viņa Middlewares
Service Providers
: šī raksta saturskvali service provider
vai tie ir ielādēti?
Viņi ir tie definites masīvā 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,
],
];
Kā redzam, ir saraksts ar service provider
nav publiski pieejams mapē /vendor
, mums nevajadzētu tos ne pieskarties, ne mainīt. Tie, kas mūs interesē, ir zemāk, ar BroadcastServicerProvider
pēc noklusējuma ir atspējots, iespējams, tāpēc, ka to izmanto reti.
Visi šie pakalpojumu sniedzēji darbojas no augšas uz leju, atkārtojot sarakstu divreiz:
register()
, noder, lai (galu galā) izpildītu kaut ko, kas konfigurēts pirms metodes boot()
.boot()
no visiem pakalpojumu sniedzējiem. Atkal, pa vienam, no augšas uz leju, no masīva 'providers'
.I Service Providers
iekļauti Laravel, ir visi, kas atrodas mapē app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Tās visas ir PHP klases, katra ir saistīta ar savu tēmu: App
, Auth
, Broadcasting
, Events
e Routes
. Bet viņiem visiem ir viena kopīga iezīme: metode boot()
.
Šīs metodes ietvaros mēs varam ierakstīt jebkuru kodu, kas saistīts ar jebkuru no šīm sadaļām: auth
, events
, route
utt. Citiem vārdiem sakot, pakalpojumu sniedzēji ir tikai klases, lai reģistrētu kādu globālu funkcionalitāti.
Tie ir atsevišķi kā “nodrošinātāji”, jo tie darbojas ļoti agrīnā lietojumprogrammas dzīves cikla posmā, tāpēc šeit ir ērti kaut kas globāls, pirms izpildes skripts nonāk modeļos vai kontrolleros.
Lielākā daļa funkcionalitātes ir RouteServiceProvider, šeit ir kods:
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());
});
}
}
Šī ir klase, kurā faili ir konfigurēti route
, Ar routes/web.php
e routes/api.php
iekļauts pēc noklusējumadefinita. Ņemiet vērā, ka API ir arī dažādas konfigurācijas: beigu punkta prefikss /api
un starpprogrammatūra api
visiem routes
.
Mēs varam rediģēt service providers
, kas nav mapē /vendor
. Šo failu pielāgošana tiek veikta, ja jums ir daudz ceļu un vēlaties tos sadalīt konkrētos failos. Jūs veidojat routes/auth.php
un ievietojiet ceļus tur, tad jūs "iespējojiet" šo failu metodē boot()
di RouteServiceProvider
, vienkārši pievienojiet trešo teikumu:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
tas ir tukšs. Tipisks koda pievienošanas piemērs AppServiceProvider
, ir par slinkās ielādes atspējošanu Eloquent . Lai to izdarītu, jums vienkārši nepieciešams pievienojiet divas rindiņas metodē boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Tas radīs izņēmumu, ja attiecību modelis netiks ielādēts.
service provider
paražaPapildus iepriekšējiem failiemdefinites, mēs varam viegli izveidot jaunu Service Provider
, kas saistīti ar citām tēmām, nevis tām, kuras iepriekšdefipabeigts kā auth
/event
/routes
.
Diezgan tipisks piemērs ir skata konfigurācija Blade
. Mēs varam izveidot direktīvu Blade
un pēc tam pievienojiet šo kodu metodei boot(
) no jebkura service provider
, tostarp noklusējuma AppServiceProvider
. Tagad izveidosim a ViewServiceProvider
atsevišķi.
Mēs to varam ģenerēt ar šo komandu:
php artisan make:provider ViewServiceProvider
Kas radīs klases tik iepriekšdefivakars:
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()
{
//
}
}
Kā redzam iekšpusē, ir divas metodes:
Reģistra() metode ļauj mums definish saites uz mūsu pakalpojumu konteineru. Piemēram, šādā kodā:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app ir globāls laravel mainīgais, kuram viena klase var piekļūt, izmantojot lietotni.
Singleton ir iezīme. Lietojot šo funkciju, mēs informējam lietojumprogrammu, ka jebkurai klasei, kas lietotnē tiek nodota kā parametrs, visā lietojumprogrammā ir jābūt tikai vienam eksemplāram. Tas nozīmē, ka MyClass tiks atrisināts vienreiz un tajā būs tikai viens gadījums, kuram var piekļūt, izmantojot mainīgo my_class.
Boot() metode ļauj piekļūt visiem pakalpojumiem, kas iepriekš reģistrēti, izmantojot reģistrēšanas metodi. Pēc tam varat iekļaut visu pakalpojumu savā lietojumprogrammā, izmantojot šo metodi.
Atgriežoties pie iepriekšējā piemēra, noņemsim metodi register()
un iekšā boot()
pievienojiet Blade direktīvas kodu:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Vēl viens piemērs ViewServiceProvider
ņemot vērā View Composers
, šeit ir fragments no oficiālās Laravel vietnes :
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) {
//
});
}
}
Lai palaistu, šis jaunais nodrošinātājs ir jāpievieno/jāreģistrē pakalpojumu sniedzēja masīvā 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
Jūs varētu arī interesēt:
Microsoft Excel ir atsauces rīks datu analīzei, jo tas piedāvā daudzas iespējas datu kopu organizēšanai,…
Walliance, SIM un platforma starp līderiem Eiropā nekustamo īpašumu kopfinansēšanas jomā kopš 2017. gada, paziņo par…
Filament ir "paātrināta" Laravel izstrādes sistēma, kas nodrošina vairākus pilnus komponentus. Tas ir paredzēts, lai vienkāršotu procesu…
«Man ir jāatgriežas, lai pabeigtu savu evolūciju: es projicēšu sevi datorā un kļūšu par tīru enerģiju. Kad apmetās…
Google DeepMind ievieš uzlabotu sava mākslīgā intelekta modeļa versiju. Jaunais uzlabotais modelis nodrošina ne tikai…
Laravel, kas slavena ar savu eleganto sintaksi un jaudīgām funkcijām, nodrošina arī stabilu pamatu moduļu arhitektūrai. Tur…
Cisco un Splunk palīdz klientiem paātrināt viņu ceļu uz nākotnes drošības operāciju centru (SOC), izmantojot…
Ransomware ir dominējusi ziņās pēdējos divus gadus. Lielākā daļa cilvēku labi apzinās, ka uzbrukumi…