Այլ կերպ ասած, ծառայություններ մատուցողները նման են ձագարի, որով մենք «դասակարգային» վառելիքը լցնում ենք տանկի մեջ, որը կոչվում է Laravel կոչվող շարժիչի «սպասարկման կոնտեյներ»:
Եթե բացենք config/app.php, կտեսնենք զանգված «մատակարար» անունով:
'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,
.
.
.
],
Սրանք ծառայություններ մատուցողներից մի քանիսն են, որոնք տրամադրվում են laravel-ի հետ միասին, այսինքն՝ հիմնական ծառայությունները, որոնք տեղադրված են ծառայության կոնտեյներով:
service provider
կատարվում են?Եթե նայենք փաստաթղթերին ըստ պահանջի կյանքի ցիկլը , սկզբում գործարկվում են հետևյալ ֆայլերը.
public/index.php
bootstrap/app.php
app/Http/Kernel.php
և նրա Middlewares
Service Providers
: այս հոդվածի բովանդակությունըինչ service provider
բեռնված են?
Դրանք են definites զանգվածում 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,
],
];
Ինչպես տեսնում ենք, կա ցուցակ service provider
թղթապանակում հրապարակային չէ /vendor
, մենք չպետք է դիպչենք, ոչ էլ փոփոխենք դրանք։ Մեզ հետաքրքրողներն են ստորև՝ հետ BroadcastServicerProvider
լռելյայն անջատված է, հավանաբար այն պատճառով, որ այն հազվադեպ է օգտագործվում:
Այս բոլոր ծառայություններ մատուցողները վազում են վերևից ներքև՝ կրկնելով ցանկը երկու անգամ:
register()
, օգտակար է (ի վերջո) մեթոդից առաջ կազմաձևված ինչ-որ բան կատարելու համար boot()
.boot()
բոլոր մատակարարներից: Կրկին, մեկ առ մեկ, վերևից ներքև, զանգվածի 'providers'
.I Service Providers
ներառված են Laravel-ում, բոլոր նրանք են, ովքեր ներկա են թղթապանակում app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Դրանք բոլորը PHP դասեր են, որոնցից յուրաքանչյուրը կապված է իր թեմայի հետ. App
, Auth
, Broadcasting
, Events
e Routes
. Բայց նրանք բոլորն ունեն մեկ ընդհանուր բան՝ մեթոդը boot()
.
Այդ մեթոդի ներսում մենք կարող ենք գրել ցանկացած կոդ՝ կապված այդ բաժիններից որևէ մեկի հետ. auth
, events
, route
և այլն։ Այլ կերպ ասած, Ծառայություններ Մատակարարները պարզապես դասեր են՝ գրանցելու որոշ գլոբալ ֆունկցիոնալություն:
Նրանք առանձնացված են որպես «մատակարարներ», քանի որ դրանք գործում են հավելվածի կյանքի ցիկլի շատ վաղ շրջանում, ուստի ինչ-որ գլոբալ բան հարմար է այստեղ, նախքան կատարող սկրիպտը կհասնի Models կամ Controllers:
Գործառույթների մեծ մասը գտնվում է RouteServiceProvider-ում, ահա կոդը.
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());
});
}
}
Սա այն դասն է, որտեղ կազմաձևված են ֆայլերը route
Հետ routes/web.php
e routes/api.php
ներառված է լռելյայնdefiնիտա. Նկատի ունեցեք, որ API-ի համար կան նաև տարբեր կոնֆիգուրացիաներ՝ վերջնակետի նախածանց /api
և միջին ծրագրակազմ api
բոլորի համար routes
.
Մենք կարող ենք խմբագրել service providers
, որոնք թղթապանակում չեն /vendor
. Այս ֆայլերի անհատականացումը կատարվում է, երբ դուք ունեք բազմաթիվ ուղիներ և ցանկանում եք դրանք առանձնացնել հատուկ ֆայլերի: Դու ստեղծում ես routes/auth.php
և այնտեղ տեղադրիր ուղիները, հետո այդ ֆայլը «միացնում ես» մեթոդի մեջ boot()
di RouteServiceProvider
, պարզապես ավելացրեք երրորդ նախադասությունը.
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
դատարկ է: Կոդ ավելացնելու բնորոշ օրինակ AppServiceProvider
, Eloquent-ում ծույլ բեռնումն անջատելու մասին է: Դա անելու համար պարզապես անհրաժեշտ է ավելացնել երկու տող մեթոդի մեջ boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Սա բացառություն կստեղծի, եթե հարաբերությունների մոդելը բեռնված չէ:
service provider
հարմարեցվածԲացի նախնական ֆայլերիցdefinites, մենք կարող ենք հեշտությամբ ստեղծել նորը Service Provider
, կապված այլ թեմաների հետ, քան նախորդներըdefiավարտվել է որպես auth
/event
/routes
.
Բավական բնորոշ օրինակ է դիտման կոնֆիգուրացիան Blade
. Մենք կարող ենք հրահանգ ստեղծել Blade
, և այնուհետև ավելացրեք այդ կոդը մեթոդի մեջ boot(
) ցանկացածից service provider
, ներառյալ լռելյայն AppServiceProvider
. Հիմա ստեղծենք ա ViewServiceProvider
անջատական
Մենք կարող ենք այն ստեղծել այս հրամանով.
php artisan make:provider ViewServiceProvider
Ինչը կստեղծի դասը այնքան վաղdefiգիշերը:
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()
{
//
}
}
Ինչպես տեսնում ենք ներսում, երկու եղանակ կա.
Register() մեթոդը մեզ թույլ է տալիս definish հղումներ մեր ծառայության կոնտեյների: Օրինակ, հետևյալ կոդում.
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app-ը գլոբալ փոփոխական է laravel-ում, որին կարող է օգտվել singleton դասը հավելվածի միջոցով:
Singleton-ը հատկանիշ է: Այս հատկությունը կիրառելիս մենք հավելվածին տեղեկացնում ենք, որ հավելվածում որպես պարամետր փոխանցված ցանկացած դաս պետք է ունենա միայն մեկ օրինակ ամբողջ հավելվածում։ Սա նշանակում է, որ MyClass-ը կլուծվի մեկ անգամ և կունենա միայն մեկ օրինակ, որին կարելի է մուտք գործել my_class փոփոխականի միջոցով:
Boot() մեթոդը թույլ է տալիս մուտք գործել նախկինում գրանցված բոլոր ծառայությունները գրանցման մեթոդի միջոցով: Այնուհետև կարող եք ամբողջ ծառայությունը ներառել ձեր հավելվածում՝ օգտագործելով այս մեթոդը:
Վերադառնալով նախորդ օրինակին, եկեք հեռացնենք մեթոդը register()
և ներսում boot()
ավելացնել Blade հրահանգի կոդը.
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Մեկ այլ օրինակ ViewServiceProvider
նկատի ունենալով View Composers
, ահա հատվածը 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) {
//
});
}
}
Գործարկելու համար այս նոր մատակարարը պետք է ավելացվի/գրանցվի մատակարարի զանգվածում 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
Ձեզ նույնպես կարող է հետաքրքրել.
Կատանիայի պոլիկլինիկայում ակնաբուժական վիրահատություն է կատարվել Apple Vision Pro գովազդային հեռուստադիտողի միջոցով…
Գունավորելու միջոցով նուրբ շարժիչ հմտությունների զարգացումը երեխաներին պատրաստում է ավելի բարդ հմտությունների, ինչպիսին է գրելը: Գունավորելու…
Ծովային ոլորտը իսկական համաշխարհային տնտեսական տերություն է, որը նավարկվել է դեպի 150 միլիարդանոց շուկա...
Անցյալ երկուշաբթի Financial Times-ը հայտարարեց OpenAI-ի հետ գործարքի մասին: FT-ն արտոնագրում է իր համաշխարհային մակարդակի լրագրությունը…