Met andere woorden, dienstverleners zijn als een trechter waardoor we "klasse" brandstof in een tank gieten die de "servicecontainer" wordt genoemd van een motor die Laravel heet.
Als we config/app.php openen, zien we een array met de naam "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,
.
.
.
],
Dit zijn enkele van de serviceproviders die samen met laravel worden geleverd, d.w.z. basisdiensten die in de servicecontainer worden geplaatst.
service provider
worden ze uitgevoerd?Als we naar de documentatie kijken levenscyclus op aanvraag , worden de volgende bestanden aan het begin uitgevoerd:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
en zijn Middlewares
Service Providers
: inhoud van dit artikelquali service provider
zijn ze geladen?
Zij zijn degenen definiten in de array 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,
],
];
Zoals we kunnen zien, is er een lijst met service provider
niet openbaar in de map /vendor
, mogen we ze niet aanraken of wijzigen. Degenen die ons interesseren zijn hieronder, met BroadcastServicerProvider
standaard uitgeschakeld, waarschijnlijk omdat het zelden wordt gebruikt.
Al deze serviceproviders lopen van boven naar beneden en herhalen de lijst twee keer:
register()
, handig voor (uiteindelijk) het uitvoeren van iets dat vóór de methode is geconfigureerd boot()
.boot()
van alle aanbieders. Nogmaals, één voor één, van boven naar beneden, van de array 'providers'
.I Service Providers
opgenomen in Laravel, zijn alle aanwezigen in de map app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Het zijn allemaal PHP-klassen, elk gerelateerd aan zijn eigen onderwerp: App
, Auth
, Broadcasting
, Events
e Routes
. Maar ze hebben allemaal één ding gemeen: methode boot()
.
Binnen die methode kunnen we elke code schrijven die betrekking heeft op een van die secties: auth
, events
, route
, enz. Met andere woorden, Service Providers zijn slechts klassen om enige globale functionaliteit te registreren.
Ze zijn gescheiden als "providers" omdat ze heel vroeg in de levenscyclus van de applicatie draaien, dus iets globaals is hier handig voordat het uitvoerende script naar Models of Controllers gaat.
De meeste functionaliteit zit in de RouteServiceProvider, hier is de code:
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());
});
}
}
Dit is de klasse waar de bestanden worden geconfigureerd route
met routes/web.php
e routes/api.php
standaard inbegrependefinee. Merk op dat er voor de API ook verschillende configuraties zijn: Eindpuntvoorvoegsel /api
en middleware api
voor iedereen routes
.
We kunnen de service providers
, die niet in de map staan /vendor
. Het aanpassen van deze bestanden wordt gedaan wanneer u veel paden heeft en deze wilt scheiden in specifieke bestanden. Jij maakt routes/auth.php
en zet de paden daar, dan "inschakelen" dat bestand in de methode boot()
di RouteServiceProvider
, voeg gewoon de derde zin toe:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
het is leeg. Een typisch voorbeeld van het toevoegen van code AppServiceProvider
, gaat over het uitschakelen van lazy loading in Eloquent . Om dit te doen, heb je gewoon nodig voeg twee regels toe bij de methode boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Dit genereert een uitzondering als een relatiemodel niet is geladen.
service provider
afgestemdeNaast de pre-bestandendefinites, kunnen we gemakkelijk een nieuwe maken Service Provider
, gerelateerd aan andere onderwerpen dan die van vóórdefiklaar als auth
/event
/routes
.
Een vrij typisch voorbeeld is de weergaveconfiguratie Blade
. We kunnen een richtlijn opstellen Blade
, en voeg vervolgens die code toe aan de methode boot(
) van welke dan ook service provider
, inclusief de standaard AppServiceProvider
. Laten we nu een maken ViewServiceProvider
apart.
We kunnen het genereren met dit commando:
php artisan make:provider ViewServiceProvider
Wat de klasse zo pre zal genererendefiavond:
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()
{
//
}
}
Zoals we van binnen kunnen zien, zijn er twee methoden:
Met de methode register() kunnen we dit doen definish links naar onze servicecontainer. Bijvoorbeeld in de volgende code:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app is een globale variabele in laravel waartoe een singleton-klasse toegang heeft via de app.
Singleton is een functie. Bij het toepassen van deze functie informeren we de applicatie dat elke klasse die als parameter in de app wordt doorgegeven, slechts één instantie in de hele applicatie mag hebben. Dit betekent dat MyClass één keer wordt opgelost en slechts één instantie heeft, die toegankelijk is met behulp van de variabele my_class.
Met de boot()-methode hebt u toegang tot alle services die eerder zijn geregistreerd met behulp van de register-methode. Via deze methode kunt u vervolgens de gehele dienst opnemen in uw aanvraag.
Terugkerend naar het vorige voorbeeld, laten we de methode verwijderen register()
en binnen boot()
voeg de Blade-richtlijncode toe:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Nog een voorbeeld van ViewServiceProvider
groeten View Composers
, hier is het fragment van de officiële Laravel-site :
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) {
//
});
}
}
Om te kunnen worden uitgevoerd, moet deze nieuwe provider worden toegevoegd aan/geregistreerd in de in provider-array 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
Ze zijn mogelijk ook geïnteresseerd in:
Microsoft Excel is de referentietool voor data-analyse, omdat het veel mogelijkheden biedt voor het organiseren van datasets,…
Walliance, SIM en platform behoren sinds 2017 tot de koplopers in Europa op het gebied van Real Estate Crowdfunding, kondigt de voltooiing aan…
Filament is een "versneld" Laravel-ontwikkelingsframework dat verschillende full-stack-componenten biedt. Het is ontworpen om het proces van…
«Ik moet terugkeren om mijn evolutie te voltooien: ik zal mezelf in de computer projecteren en pure energie worden. Eenmaal gesetteld…
Google DeepMind introduceert een verbeterde versie van zijn kunstmatige-intelligentiemodel. Het nieuwe, verbeterde model biedt niet alleen…
Laravel, beroemd om zijn elegante syntaxis en krachtige functies, biedt ook een solide basis voor modulaire architectuur. Daar…
Cisco en Splunk helpen klanten hun reis naar het Security Operations Center (SOC) van de toekomst te versnellen met…
Ransomware heeft het nieuws de afgelopen twee jaar gedomineerd. De meeste mensen weten heel goed dat aanvallen...