Məqalələr

Laraveldə xidmət təminatçıları: onlar nədir və Laraveldə xidmət təminatçılarından necə istifadə etmək olar

Laravel xidmət təminatçıları tətbiqin başladığı mərkəzi yerdir. Yəni, əsas Laravel xidmətləri və tətbiq xidmətləri, sinifləri və onların asılılıqları provayderlər vasitəsilə xidmət konteynerinə yerləşdirilir. 

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.

misal

Ə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.

Zaman mən 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əzmunu

cə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ə:

  • Birinci iterasiya isteğe bağlı metod axtarır register(), metoddan əvvəl konfiqurasiya edilmiş bir şeyi yerinə yetirmək üçün (nəticədə) faydalıdır boot().
  • ikinci iterasiya üsulu yerinə yetirir boot() bütün provayderlərdən. Yenə bir-bir, yuxarıdan aşağıya, serialın 'providers'.
  • Nəhayət, bütün xidmət təminatçıları işləndikdən sonra Laravel yolu (marşrutu) təhlil etməyə, nəzarətçini işə salmağa, şablonlardan istifadə etməyə və s.

Xidmət Təchizatçıları Laravel predefiniti

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, routevə 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 routeIlə routes/web.phproutes/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 providersqovluqda 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():

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.
// 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.

Özünüzü yaradın 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

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

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:

İnnovasiya bülleteni
Yeniliklərlə bağlı ən vacib xəbərləri qaçırmayın. Onları e-poçtla almaq üçün qeydiyyatdan keçin.

Articoli recenti

Veeam müdafiədən tutmuş cavab və bərpaya qədər ransomware üçün ən əhatəli dəstəyi təqdim edir

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...

23 Aprel 2024

Yaşıl və Rəqəmsal İnqilab: Proqnozlaşdırılan Baxım Neft və Qaz Sənayesini necə çevirir?

Proqnozlaşdırılan texniki xidmət zavodun idarə edilməsinə innovativ və proaktiv yanaşma ilə neft və qaz sektorunda inqilab edir.…

22 Aprel 2024

Böyük Britaniyanın antiinhisar tənzimləyicisi GenAI üzərində BigTech həyəcanını qaldırır

Böyük Britaniyanın CMA süni intellekt bazarında Big Tech-in davranışı ilə bağlı xəbərdarlıq edib. Orada…

18 Aprel 2024

Casa Green: İtaliyada davamlı gələcək üçün enerji inqilabı

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ı ...

18 Aprel 2024