Med andre ord, tjenesteleverandører er som en trakt der vi heller "klasse" drivstoff i en tank kalt "servicebeholderen" til en motor kalt Laravel.
Hvis vi åpner config/app.php vil vi se en matrise med navnet "leverandør"
'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,
.
.
.
],
Dette er noen av tjenesteleverandørene som leveres sammen med laravel, det vil si basistjenester som legges i servicecontaineren.
service provider
blir de utført?Hvis vi ser på dokumentasjonen på forespørsel livssyklus , blir følgende filer utført i starten:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
og hans Middlewares
Service Providers
: innholdet i denne artikkelenHva service provider
er de lastet?
Det er de definetter 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 det en liste over service provider
ikke offentlig i mappen /vendor
, vi bør verken berøre eller endre dem. De som interesserer oss er under, med BroadcastServicerProvider
deaktivert som standard, sannsynligvis fordi den sjelden brukes.
Alle disse tjenesteleverandørene kjører fra topp til bunn, og gjentar listen to ganger:
register()
, nyttig for (til slutt) å utføre noe konfigurert før metoden boot()
.boot()
av alle tilbydere. Igjen, en etter en, topp til bunn, av matrisen 'providers'
.I Service Providers
inkludert i Laravel, er alle de som er tilstede i mappen app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
De er alle PHP-klasser, hver relatert til sitt eget emne: App
, Auth
, Broadcasting
, Events
e Routes
. Men de har alle én ting til felles: metode boot()
.
Inne i den metoden kan vi skrive hvilken som helst kode relatert til noen av disse seksjonene: auth
, events
, route
, etc. Med andre ord, tjenesteleverandører er bare klasser for å registrere noe global funksjonalitet.
De er separate som "leverandører" fordi de kjører veldig tidlig i applikasjonens livssyklus, så noe globalt er praktisk her før det kjørende skriptet kommer til modeller eller kontroller.
Det meste av funksjonaliteten 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 der filene er konfigurert route
, Med routes/web.php
e routes/api.php
inkludert som standarddefinita. Merk at for API er det også forskjellige konfigurasjoner: Endpoint prefix /api
og mellomvare api
for alle routes
.
Vi kan redigere service providers
, som ikke er i mappen /vendor
. Tilpasning av disse filene gjøres når du har mange baner og ønsker å dele dem i spesifikke filer. Du skaper routes/auth.php
og legg stiene der, så "aktiverer" du den filen i metoden boot()
di RouteServiceProvider
, bare legg til den tredje setningen:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
den er tom. Et typisk eksempel på å legge til kode AppServiceProvider
, handler om å deaktivere lat lasting i Eloquent . For å gjøre dette trenger du bare legg til to linjer i metoden boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Dette vil gi et unntak hvis en relasjonsmodell ikke er lastet inn.
service provider
tilpassetI tillegg til forhåndsfilenedefinetter, kan vi enkelt lage en ny Service Provider
, relatert til andre emner enn de førdefiferdig som auth
/event
/routes
.
Et ganske typisk eksempel er visningskonfigurasjonen Blade
. Vi kan lage et direktiv Blade
, og legg deretter til den koden i metoden boot(
) av noen service provider
, inkludert standard AppServiceProvider
. La oss nå lage en ViewServiceProvider
skille.
Vi kan generere den med denne kommandoen:
php artisan make:provider ViewServiceProvider
Som vil generere klassen så predefikveld:
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 på innsiden er det to metoder:
Register()-metoden lar oss definish linker til vår servicebeholder. 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å tilgang til gjennom appen.
Singleton er en funksjon. Når vi bruker denne funksjonen, informerer vi applikasjonen om at uansett hvilken klasse som sendes som en parameter i appen bare skal ha én forekomst i hele applikasjonen. Dette betyr at MyClass vil bli løst én gang og vil bare ha én forekomst, som kan nås ved å bruke my_class-variabelen.
Boot()-metoden lar deg få tilgang til alle tjenester som tidligere er registrert ved hjelp av registermetoden. Du kan deretter inkludere hele tjenesten i søknaden din ved å bruke denne metoden.
Gå tilbake til forrige eksempel, la oss fjerne metoden register()
og innenfor boot()
legg til 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'); ?>";
});
}
Et annet eksempel på ViewServiceProvider
det berører View Composers
, her er utdraget fra den offisielle Laravel-siden :
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 å kjøre, må denne nye leverandøren legges til/registreres i leverandørarrayet 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 interessert i:
Sist mandag kunngjorde Financial Times en avtale med OpenAI. FT lisensierer sin journalistikk i verdensklasse...
Millioner av mennesker betaler for strømmetjenester og betaler månedlige abonnementsavgifter. Det er vanlig oppfatning at du...
Coveware by Veeam vil fortsette å tilby responstjenester for cyberutpressing. Coveware vil tilby kriminaltekniske og utbedringsmuligheter...
Prediktivt vedlikehold revolusjonerer olje- og gasssektoren, med en innovativ og proaktiv tilnærming til anleggsledelse...