Sa madaling salita, ang mga service provider ay parang funnel kung saan ibinubuhos namin ang "class" na gasolina sa isang tangke na tinatawag na "service container" ng isang makina na tinatawag na Laravel.
Kung bubuksan natin ang config/app.php makakakita tayo ng array na may pangalang "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,
.
.
.
],
Ito ang ilan sa mga service provider na ibinigay kasama ng laravel, ibig sabihin, mga pangunahing serbisyo na inilalagay sa lalagyan ng serbisyo.
service provider
ginaganap ba sila?Kung titingnan natin ang dokumentasyon lifecycle kapag hiniling , ang mga sumusunod na file ay isinasagawa sa simula:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
at ang kanyang Middlewares
Service Providers
: nilalaman ng artikulong itoquali service provider
load ba sila?
Sila ang mga iyon definites sa 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,
],
];
Tulad ng nakikita natin, mayroong isang listahan ng service provider
hindi pampubliko sa folder /vendor
, hindi natin dapat hawakan o baguhin ang mga ito. Nasa ibaba ang mga interesado sa amin, kasama ang BroadcastServicerProvider
hindi pinagana bilang default, marahil dahil ito ay bihirang ginagamit.
Ang lahat ng mga service provider na ito ay tumatakbo mula sa itaas hanggang sa ibaba, na inuulit ang listahan dalawang beses:
register()
, kapaki-pakinabang para sa (kalaunan) pagpapatupad ng isang bagay na na-configure bago ang pamamaraan boot()
.boot()
ng lahat ng provider. Muli, isa-isa, itaas hanggang ibaba, ng array 'providers'
.I Service Providers
kasama sa Laravel, ang lahat ng naroroon sa folder app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Lahat sila ay mga klase sa PHP, bawat isa ay nauugnay sa sarili nitong paksa: App
, Auth
, Broadcasting
, Events
e Routes
. Ngunit lahat sila ay may isang bagay na karaniwan: pamamaraan boot()
.
Sa loob ng pamamaraang iyon, maaari tayong magsulat ng anumang code na nauugnay sa alinman sa mga seksyong iyon: auth
, events
, route
, atbp. Sa madaling salita, ang mga Service Provider ay mga klase lamang upang magrehistro ng ilang pandaigdigang pag-andar.
Hiwalay sila bilang "provider" dahil napakaaga silang tumatakbo sa lifecycle ng application, kaya isang bagay na pandaigdigan ang maginhawa dito bago mapunta ang executing script sa Mga Modelo o Controller.
Karamihan sa functionality ay nasa RouteServiceProvider, narito ang 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());
});
}
}
Ito ang klase kung saan naka-configure ang mga file route
, Sa routes/web.php
e routes/api.php
kasama bilang defaultdefinita. Tandaan na para sa API mayroon ding iba't ibang configuration: Endpoint prefix /api
at middleware api
para sa lahat routes
.
Maaari naming i-edit ang service providers
, na wala sa folder /vendor
. Ginagawa ang pag-customize sa mga file na ito kapag marami kang mga path at gusto mong paghiwalayin ang mga ito sa mga partikular na file. Lumikha ka routes/auth.php
at ilagay ang mga landas doon, pagkatapos ay "paganahin" mo ang file na iyon sa pamamaraan boot()
di RouteServiceProvider
, idagdag lang ang pangatlong pangungusap:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
ito ay walang laman. Isang tipikal na halimbawa ng pagdaragdag ng code AppServiceProvider
, ay tungkol sa hindi pagpapagana ng lazy loading sa Eloquent . Upang gawin ito, kailangan mo lamang magdagdag ng dalawang linya sa pamamaraan boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Magbibigay ito ng exception kung hindi na-load ang isang modelo ng relasyon.
service provider
customizedBilang karagdagan sa mga pre filedefigabi, madali tayong makakagawa ng bago Service Provider
, na may kaugnayan sa iba pang mga paksa kaysa sa mga predefinatapos bilang auth
/event
/routes
.
Ang isang medyo karaniwang halimbawa ay ang pagsasaayos ng view Blade
. Maaari tayong lumikha ng isang direktiba Blade
, at pagkatapos ay idagdag ang code na iyon sa pamamaraan boot(
) ng alinman service provider
, kasama ang default AppServiceProvider
. Gumawa tayo ngayon ng a ViewServiceProvider
magkahiwalay.
Magagawa natin ito gamit ang command na ito:
php artisan make:provider ViewServiceProvider
Which will generate the class kaya predefigabi:
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()
{
//
}
}
Tulad ng nakikita natin sa loob mayroong dalawang pamamaraan:
Ang register() method ay nagpapahintulot sa amin na defimga link sa aming lalagyan ng serbisyo. Halimbawa, sa sumusunod na code:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
Ang $this->app ay isang pandaigdigang variable sa laravel na maaaring ma-access ng singleton class sa pamamagitan ng app.
Singleton ay isang tampok. Kapag inilalapat ang feature na ito, ipinapaalam namin sa application na ang anumang klase na ipinasa bilang parameter sa app ay dapat lang magkaroon ng isang instance sa buong application. Nangangahulugan ito na ang MyClass ay malulutas nang isang beses at magkakaroon lamang ng isang instance, na maaaring ma-access gamit ang my_class variable.
Binibigyang-daan ka ng pamamaraang boot() na ma-access ang lahat ng mga serbisyong dati nang nakarehistro gamit ang paraan ng pagrehistro. Maaari mong isama ang buong serbisyo sa iyong aplikasyon gamit ang paraang ito.
Bumalik sa nakaraang halimbawa, alisin natin ang pamamaraan register()
at sa loob boot()
idagdag ang Blade directive code:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Isa pang halimbawa ng ViewServiceProvider
pag-aalala nito View Composers
, narito ang snippet mula sa opisyal na site ng 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) {
//
});
}
}
Upang tumakbo, ang bagong provider na ito ay dapat idagdag/irehistro sa 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
Maaari ka ring maging interesado sa:
Noong nakaraang Lunes, inihayag ng Financial Times ang isang deal sa OpenAI. Nilisensyahan ng FT ang world-class na pamamahayag nito...
Milyun-milyong tao ang nagbabayad para sa mga serbisyo ng streaming, na nagbabayad ng buwanang bayad sa subscription. Karaniwang opinyon na ikaw ay…
Ang Coveware ng Veeam ay patuloy na magbibigay ng mga serbisyo sa pagtugon sa insidente ng cyber extortion. Mag-aalok ang Coveware ng mga kakayahan sa forensics at remediation...
Binabago ng predictive maintenance ang sektor ng langis at gas, na may makabago at proactive na diskarte sa pamamahala ng halaman.…