Başqa sözlə desək, xidmət təminatçıları bir huni kimidir ki, onun vasitəsilə biz Laravel adlı mühərrikin “xidmət konteyneri” deyilən çənə “sinif” yanacaq tökürük.
Əgər config/app.php faylını açsaq, “provayder” adlı massiv görəcəyik.
'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,
.
.
.
],
Bunlar laravel ilə birlikdə təqdim edilən bəzi xidmət təminatçılarıdır, yəni xidmət konteynerinə yerləşdirilən əsas xidmətlərdir.
service provider
icra olunurlar?Sənədlərə baxsaq tələb üzrə həyat dövrü , aşağıdakı fayllar başlanğıcda icra olunur:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
və onun Middlewares
Service Providers
: bu məqalənin məzmunucəhətdən service provider
yükləniblər?
Onlar bunlardır defimassivdə 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,
],
];
Gördüyümüz kimi, siyahı var service provider
qovluqda ictimai deyil /vendor
, biz onlara toxunmamalı və dəyişdirməməliyik. Bizi maraqlandıranlar aşağıdadır, ilə BroadcastServicerProvider
ehtimal ki, nadir hallarda istifadə edildiyi üçün defolt olaraq söndürülür.
Bütün bu xidmət təminatçıları siyahı təkrarlayaraq yuxarıdan aşağıya doğru işləyirlər iki dəfə:
register()
, metoddan əvvəl konfiqurasiya edilmiş bir şeyi yerinə yetirmək üçün (nəticədə) faydalıdır boot()
.boot()
bütün provayderlərdən. Yenə bir-bir, yuxarıdan aşağıya, serialın 'providers'
.I Service Providers
Laravel-ə daxil olanlar, qovluqda olanların hamısıdır app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Onların hamısı PHP sinifləridir, hər biri öz mövzusu ilə bağlıdır: App
, Auth
, Broadcasting
, Events
e Routes
. Lakin onların hamısının ortaq bir cəhəti var: metod boot()
.
Bu metodun içərisində biz həmin bölmələrdən hər hansı birinə aid istənilən kodu yaza bilərik: auth
, events
, route
və s. Başqa sözlə, Xidmət Provayderləri bəzi qlobal funksionallığı qeydiyyatdan keçirmək üçün sadəcə siniflərdir.
Onlar "təminatçılar" kimi ayrıdırlar, çünki onlar tətbiqin həyat dövrünün çox erkən mərhələsində işləyirlər, buna görə də icraedici skript Modellərə və ya Nəzarətçilərə çatmazdan əvvəl qlobal bir şey burada rahatdır.
Funksionallığın çoxu RouteServiceProvider-dədir, kod budur:
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());
});
}
}
Bu, faylların konfiqurasiya olunduğu sinifdir route
Ilə routes/web.php
e routes/api.php
default olaraq daxil edilirdefinita. Qeyd edək ki, API üçün müxtəlif konfiqurasiyalar da mövcuddur: Endpoint prefiksi /api
və ara proqram api
hamı üçün routes
.
redaktə edə bilərik service providers
qovluqda olmayanlar /vendor
. Bu faylların fərdiləşdirilməsi çoxlu yollarınız olduqda və onları xüsusi fayllara ayırmaq istədiyiniz zaman edilir. Siz yaradırsınız routes/auth.php
və yolları oraya qoyun, sonra həmin faylı metodda "aktiv edirsiniz" boot()
di RouteServiceProvider
, sadəcə üçüncü cümlə əlavə edin:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
boşdur. Kod əlavə etmək üçün tipik bir nümunə AppServiceProvider
, Eloquent-də tənbəl yükləməni söndürmək haqqındadır. Bunu etmək üçün sadəcə ehtiyacınız var iki sətir əlavə edin metodunda boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Əgər əlaqə modeli yüklənməsə, bu, istisna yaradacaq.
service provider
xüsusiƏvvəlcədən fayllara əlavə olaraqdefinites, biz asanlıqla yenisini yarada bilərik Service Provider
, əvvəlki mövzulardan başqa digər mövzularla əlaqəlidefikimi bitirdi auth
/event
/routes
.
Kifayət qədər tipik bir nümunə görünüş konfiqurasiyasıdır Blade
. Direktiv yarada bilərik Blade
, və sonra həmin kodu metoda əlavə edin boot(
) hər hansı service provider
, standart daxil olmaqla AppServiceProvider
. İndi a yaradaq ViewServiceProvider
ayrı.
Bunu bu əmrlə yarada bilərik:
php artisan make:provider ViewServiceProvider
Hansı sinif belə pre yaradacaqdefigecə:
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()
{
//
}
}
İçəridə gördüyümüz kimi iki üsul var:
register() metodu bizə imkan verir defixidmət konteynerimizə bağlantılar. Məsələn, aşağıdakı kodda:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app Singleton sinfinin proqram vasitəsilə daxil ola biləcəyi laraveldə qlobal dəyişəndir.
Singleton bir xüsusiyyətdir. Bu funksiyanı tətbiq edərkən biz proqrama məlumat veririk ki, tətbiqdə parametr kimi hansı sinif ötürülürsə, bütün tətbiqdə yalnız bir nümunə olmalıdır. Bu o deməkdir ki, MyClass bir dəfə həll ediləcək və my_class dəyişənindən istifadə etməklə əldə edilə bilən yalnız bir nümunəyə sahib olacaq.
boot() metodu sizə registr metodundan istifadə edərək əvvəllər qeydə alınmış bütün xidmətlərə daxil olmağa imkan verir. Daha sonra bu üsuldan istifadə edərək bütün xidməti tətbiqinizə daxil edə bilərsiniz.
Əvvəlki nümunəyə qayıdaraq, metodu çıxaraq register()
və daxilində boot()
Blade direktiv kodunu əlavə edin:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Başqa bir misal ViewServiceProvider
hörmət View Composers
, budur fraqment rəsmi Laravel saytından :
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) {
//
});
}
}
İşləmək üçün bu yeni provayder provayder massivinə əlavə edilməli/qeydiyyatdan keçməlidir 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
Sizi də maraqlandıra bilər:
Coveware by Veeam kiber qəsb hallarına cavab xidmətləri göstərməyə davam edəcək. Coveware məhkəmə və remediasiya imkanları təklif edəcək...
Proqnozlaşdırılan texniki xidmət zavodun idarə edilməsinə innovativ və proaktiv yanaşma ilə neft və qaz sektorunda inqilab edir.…
Böyük Britaniyanın CMA süni intellekt bazarında Big Tech-in davranışı ilə bağlı xəbərdarlıq edib. Orada…
Avropa İttifaqı tərəfindən binaların enerji səmərəliliyini artırmaq üçün tərtib edilən "Yaşıl Evlər" Fərmanı qanunvericilik prosesini yekunlaşdırdı ...