En altres paraules, els proveïdors de serveis són com un embut a través del qual aboquem combustible "de classe" en un dipòsit anomenat "contenidor de servei" d'un motor anomenat Laravel.
Si obrim config/app.php veurem una matriu amb el nom "proveïdor"
'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,
.
.
.
],
Aquests són alguns dels proveïdors de serveis que ofereixen juntament amb laravel, és a dir, serveis bàsics que es col·loquen al contenidor del servei.
service provider
es fan?Si mirem la documentació cicle de vida a petició , els fitxers següents s'executen a l'inici:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
i la seva Middlewares
Service Providers
: contingut d'aquest articleQuè service provider
estan carregats?
Són aquells definits a la matriu 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,
],
];
Com podem veure, hi ha una llista service provider
no és públic a la carpeta /vendor
, no els hem de tocar ni modificar. Els que ens interessen estan a continuació, amb BroadcastServicerProvider
desactivat per defecte, probablement perquè s'utilitza poques vegades.
Tots aquests proveïdors de serveis funcionen de dalt a baix, repetint la llista dues vegades:
register()
, útil per (eventualment) executar alguna cosa configurada abans del mètode boot()
.boot()
de tots els proveïdors. De nou, un per un, de dalt a baix, de la matriu 'providers'
.I Service Providers
inclosos a Laravel, són tots els presents a la carpeta app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Totes són classes PHP, cadascuna relacionada amb el seu propi tema: App
, Auth
, Broadcasting
, Events
e Routes
. Però tots tenen una cosa en comú: el mètode boot()
.
Dins d'aquest mètode, podem escriure qualsevol codi relacionat amb qualsevol d'aquestes seccions: auth
, events
, route
, etc. En altres paraules, els proveïdors de serveis són només classes per registrar alguna funcionalitat global.
Estan separats com a "proveïdors" perquè s'executen molt aviat en el cicle de vida de l'aplicació, de manera que alguna cosa global és convenient aquí abans que l'script d'execució arribi a Models o Controllers.
La major part de la funcionalitat es troba a RouteServiceProvider, aquí teniu el codi:
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());
});
}
}
Aquesta és la classe on es configuren els fitxers route
, Amb routes/web.php
e routes/api.php
inclòs per defectedefinita. Tingueu en compte que per a l'API també hi ha diferents configuracions: Prefix del punt final /api
i middleware api
per a tot routes
.
Podem editar el service providers
, que no es troben a la carpeta /vendor
. La personalització d'aquests fitxers es fa quan teniu molts camins i voleu separar-los en fitxers específics. Tu crees routes/auth.php
i poseu-hi els camins i, a continuació, "activeu" aquest fitxer al mètode boot()
di RouteServiceProvider
, només cal afegir la tercera frase:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
està buit. Un exemple típic d'afegir codi AppServiceProvider
, tracta de desactivar la càrrega mandrosa a Eloquent . Per fer-ho, només cal afegir dues línies en el mètode boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Això generarà una excepció si no es carrega un model de relació.
service provider
personalitzatA més dels fitxers predefinits, podem crear-ne de nou fàcilment Service Provider
, relacionats amb altres temes diferents dels predefiacabat com auth
/event
/routes
.
Un exemple bastant típic és la configuració de la vista Blade
. Podem crear una directiva Blade
, i després afegiu aquest codi al mètode boot(
) de qualsevol service provider
, inclosa la predeterminada AppServiceProvider
. Ara creem un ViewServiceProvider
separat.
El podem generar amb aquesta comanda:
php artisan make:provider ViewServiceProvider
El que generarà la classe tan predefinit:
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()
{
//
}
}
Com podem veure a l'interior hi ha dos mètodes:
El mètode register() ens permet defienllaços acabats al nostre contenidor de servei. Per exemple, en el codi següent:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app és una variable global a laravel a la qual una classe singleton pot accedir a través de l'aplicació.
Singleton és una característica. Quan apliquem aquesta característica, estem informant a l'aplicació que qualsevol classe que es passi com a paràmetre a l'aplicació només hauria de tenir una instància a tota l'aplicació. Això vol dir que MyClass es resoldrà una vegada i només tindrà una instància, a la qual es pot accedir mitjançant la variable my_class.
El mètode boot() us permet accedir a tots els serveis registrats prèviament mitjançant el mètode register. A continuació, podeu incloure tot el servei a la vostra aplicació mitjançant aquest mètode.
Tornant a l'exemple anterior, eliminem el mètode register()
i dins boot()
afegiu el codi de directiva Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Un altre exemple de ViewServiceProvider
es refereix View Composers
, aquí teniu el fragment del lloc oficial de 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) {
//
});
}
}
Per executar-se, aquest nou proveïdor s'ha d'afegir/registrar a la matriu de proveïdors 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
També us pot interessar:
El sector naval és una veritable potència econòmica mundial, que ha navegat cap a un mercat de 150 milions...
Dilluns passat, el Financial Times va anunciar un acord amb OpenAI. FT autoritza el seu periodisme de classe mundial...
Milions de persones paguen per serveis de streaming, pagant quotes de subscripció mensuals. És l'opinió comuna que tu...
Coveware de Veeam continuarà oferint serveis de resposta a incidents d'extorsió cibernètica. Coveware oferirà capacitats forenses i de reparació...