Maqolalar

Laraveldagi xizmat ko'rsatuvchi provayderlar: ular nima va Laravelda xizmat ko'rsatuvchi provayderlardan qanday foydalanish

Laravel xizmat ko'rsatuvchi provayderlari dastur ishga tushiriladigan markaziy joydir. Ya'ni, asosiy Laravel xizmatlari va dastur xizmatlari, sinflari va ularning bog'liqliklari provayderlar orqali xizmat ko'rsatish konteyneriga joylashtiriladi. 

Boshqacha qilib aytganda, xizmat ko'rsatuvchi provayderlar huniga o'xshaydi, u orqali biz "sinf" yoqilg'ini Laravel deb nomlangan dvigatelning "xizmat ko'rsatish konteyneri" deb nomlangan tankga quyamiz.

misol

Agar config/app.php ni ochsak, biz "provayder" nomli massivni ko'ramiz.

'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,
        .
        .
        .
],

Bu laravel bilan birga taqdim etiladigan ba'zi xizmat ko'rsatuvchi provayderlar, ya'ni xizmat ko'rsatish konteyneriga joylashtirilgan asosiy xizmatlar.

Men qachon service provider ular bajariladimi?

Agar biz hujjatlarni ko'rib chiqsak so'rov bo'yicha hayot aylanishi , quyidagi fayllar boshida bajariladi:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php va uning Middlewares
  • Service Providers: ushbu maqolaning mazmuni

Qaysi service provider ular yuklanganmi? 

Ular o'shalar defimassivdagi 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,
 
    ],
 
];

Ko'rib turganimizdek, ro'yxat mavjud service provider papkada ochiq emas /vendor, biz ularga tegmasligimiz yoki o'zgartirmasligimiz kerak. Bizni qiziqtirganlar quyida, bilan BroadcastServicerProvider sukut bo'yicha o'chirilgan, ehtimol u kamdan-kam qo'llaniladi.

Ushbu xizmat ko'rsatuvchi provayderlarning barchasi ro'yxatni takrorlab, yuqoridan pastgacha ishlaydi ikki marta:

  • Birinchi iteratsiya ixtiyoriy usulni qidiradi register(), (oxir-oqibat) usuldan oldin tuzilgan biror narsani bajarish uchun foydalidir boot().
  • ikkinchi iteratsiya usulni bajaradi boot() barcha provayderlar. Yana birma-bir, yuqoridan pastga, massiv 'providers'.
  • Nihoyat, barcha xizmat ko'rsatuvchi provayderlarga ishlov berilgandan so'ng, Laravel yo'lni (marshrutni) tahlil qilish, kontrollerni ishga tushirish, shablonlardan foydalanish va hokazolarga o'tadi.

Xizmat ko'rsatuvchi provayderlar Laravel predefina

I Service Providers Laravelga kiritilgan, papkada mavjud bo'lganlarning barchasi app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Ularning barchasi PHP sinflari bo'lib, ularning har biri o'z mavzusi bilan bog'liq: App, Auth, Broadcasting, Events e Routes. Ammo ularning barchasida bitta umumiy narsa bor: usul boot().

Ushbu usul ichida biz ushbu bo'limlarning har qandayiga tegishli har qanday kodni yozishimiz mumkin: auth, events, route, va boshqalar. Boshqacha qilib aytganda, Xizmat ko'rsatuvchi provayderlar ba'zi global funktsiyalarni ro'yxatdan o'tkazish uchun sinflardir.

Ular "provayderlar" sifatida alohida, chunki ular ilovaning hayot aylanishining boshida ishlaydi, shuning uchun bajaruvchi skript Modellar yoki Kontrollerlarga kirishdan oldin global narsa qulay bo'ladi.

Funktsionallikning aksariyati RouteServiceProvider-da, bu erda kod:

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 sozlangan sinf routebilan routes/web.phproutes/api.php sukut bo'yicha kiritilgandefinita. E'tibor bering, API uchun turli xil konfiguratsiyalar ham mavjud: Endpoint prefiksi /api va o'rta dastur api Barcha uchun routes.

ni tahrirlashimiz mumkin service providerspapkada bo'lmagan /vendor. Ushbu fayllarni sozlash sizda ko'p yo'llar mavjud bo'lganda va ularni muayyan fayllarga ajratishni xohlasangiz amalga oshiriladi. Siz yaratasiz routes/auth.php va u erga yo'llarni qo'ying, keyin siz ushbu faylni usulda "yoqasiz" boot() di RouteServiceProvider, faqat uchinchi jumlani qo'shing:

`Route::middleware('web') // or maybe you want another middleware?
    ->group(base_path('routes/auth.php'));

AppServiceProvider u bo'sh. Kod qo'shishning odatiy misoli AppServiceProvider, Eloquent-da dangasa yuklashni o'chirish haqida. Buning uchun sizga faqat kerak ikkita qator qo'shing usulda boot():

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Agar munosabatlar modeli yuklanmagan bo'lsa, bu istisno qiladi.

O'zingizni yarating service provider shaxsiylashtirilgan

Oldindan fayllarga qo'shimcha ravishdadefinites, biz osongina yangisini yaratishimiz mumkin Service Provider, oldingi mavzulardan boshqa mavzular bilan bog'liqdefisifatida yakunlandi auth/event/routes.

Oddiy misol - ko'rish konfiguratsiyasi Blade. Biz direktiv yaratishimiz mumkin Blade, va keyin ushbu kodni usulga qo'shing boot() har qanday service provider, shu jumladan standart AppServiceProvider. Endi a yarataylik ViewServiceProvider alohida.

Biz uni ushbu buyruq bilan yaratishimiz mumkin:

php artisan make:provider ViewServiceProvider

Bu sinfni juda oldindan yaratadidefikechasi:

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()
    {
        //
    }
}

Ko'rib turganimizdek, ichkarida ikkita usul mavjud:

Registr() usuli

Register() usuli bizga imkon beradi defibizning xizmat konteynerimizga havolalar. Masalan, quyidagi kodda:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app laraveldagi global oʻzgaruvchi boʻlib, unga Singleton sinfi ilova orqali kirishi mumkin.

Singleton - bu xususiyat. Ushbu xususiyatni qo'llashda biz ilovaga ilovada parametr sifatida qabul qilingan har qanday sinf butun ilovada faqat bitta nusxaga ega bo'lishi kerakligini bildiramiz. Bu shuni anglatadiki, MyClass bir marta hal qilinadi va faqat bitta nusxaga ega bo'ladi, unga my_class o'zgaruvchisi yordamida kirish mumkin.

boot() usuli

Boot() usuli sizga ro'yxatga olish usuli yordamida avval ro'yxatdan o'tgan barcha xizmatlarga kirish imkonini beradi. Keyin ushbu usuldan foydalanib, butun xizmatni ilovangizga kiritishingiz mumkin.

Oldingi misolga qaytsak, usulni olib tashlaymiz register() va ichida boot() Blade direktiv kodini qo'shing:

use Illuminate\Support\Facades\Blade;
 
public function boot()
{
    Blade::directive('datetime', function ($expression) {
        return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
    });
}

Yana bir misol ViewServiceProvider munosabat View Composers, mana bu parcha Laravel rasmiy saytidan :

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) {
            //
        });
    }
}

Ishlash uchun ushbu yangi provayder provayder qatoriga qo'shilishi/ro'yxatdan o'tkazilishi kerak 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

Sizni ham qiziqtirishi mumkin:

Innovatsion axborot byulleteni
Innovatsiyalar haqidagi eng muhim yangiliklarni o'tkazib yubormang. Ularni elektron pochta orqali olish uchun ro'yxatdan o'ting.

So'nggi maqolalar

Bolalar uchun sahifalarni bo'yashning afzalliklari - barcha yoshdagilar uchun sehrli dunyo

Rang berish orqali nozik vosita ko'nikmalarini rivojlantirish bolalarni yozish kabi murakkabroq ko'nikmalarga tayyorlaydi. Rang berish uchun…

2 may 2024

Kelajak bu yerda: Yuk tashish sanoati global iqtisodiyotni qanday inqilob qilmoqda

Harbiy dengiz sektori 150 milliardlik bozorga yo'l olgan haqiqiy global iqtisodiy kuchdir...

1 may 2024

Noshirlar va OpenAI sun'iy intellekt tomonidan qayta ishlangan ma'lumotlar oqimini tartibga solish bo'yicha shartnomalar imzolaydilar.

O'tgan dushanba kuni Financial Times OpenAI bilan shartnoma imzolaganini e'lon qildi. FT o'zining jahon darajasidagi jurnalistikasini litsenziyalaydi...

30 Aprel 2024

Onlayn to'lovlar: Streaming xizmatlari sizni qanday qilib abadiy to'lashga majbur qiladi

Millionlab odamlar oylik abonent to'lovlarini to'lab, oqim xizmatlari uchun to'laydilar. Umumiy fikr, siz ...

29 Aprel 2024