Басқаша айтқанда, қызмет көрсетушілер біз 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
олар жүктелді ме?
Олар сол defiмассивтегі nites 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
Ларавелге енгізілген, қалтада барлардың барлығы app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Олардың барлығы PHP сыныптары, әрқайсысы өз тақырыбына қатысты: App
, Auth
, Broadcasting
, Events
e Routes
. Бірақ олардың барлығына ортақ бір нәрсе бар: әдіс boot()
.
Бұл әдістің ішінде біз сол бөлімдердің кез келгеніне қатысты кез келген кодты жаза аламыз: auth
, events
, route
, т.б. Басқаша айтқанда, Сервис провайдерлері кейбір жаһандық функцияларды тіркеуге арналған сыныптар ғана.
Олар «провайдерлер» ретінде бөлек, себебі олар қолданбаның өмірлік циклінде өте ерте жұмыс істейді, сондықтан орындалатын сценарий Үлгілер немесе контроллерлерге жеткенге дейін мұнда ғаламдық нәрсе ыңғайлы.
Функционалдықтардың көпшілігі 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() әдісі бізге мүмкіндік береді defiбіздің қызмет контейнеріне сілтемелер. Мысалы, келесі кодта:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app — синглтон класы қолданба арқылы қол жеткізе алатын laravelдегі жаһандық айнымалы.
Синглтон - бұл ерекшелік. Бұл мүмкіндікті қолдану кезінде біз қолданбаға параметр ретінде қолданбадағы кез келген сыныптың бүкіл қолданбада тек бір данасы болуы керек екенін хабарлаймыз. Бұл 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
Сондай-ақ сізді қызықтыруы мүмкін:
Өткен дүйсенбіде Financial Times OpenAI-мен келісім туралы жариялады. FT өзінің әлемдік деңгейдегі журналистикасына лицензия береді…
Миллиондаған адамдар ай сайынғы абоненттік төлемді төлей отырып, ағынды қызметтерге ақы төлейді. Жалпы пікір, сіз…
Veeam ұсынған Coveware кибербопсалау оқиғаларына жауап беру қызметтерін көрсетуді жалғастырады. Coveware криминалистикалық және қалпына келтіру мүмкіндіктерін ұсынады ...
Болжалды техникалық қызмет көрсету зауытты басқаруға инновациялық және белсенді көзқараспен мұнай және газ секторында төңкеріс жасайды.…