Артиколи

Ларавелдегі қызмет жеткізушілері: олар дегеніміз не және Ларавелдегі қызмет жеткізушілерін қалай пайдалану керек

Laravel қызмет провайдерлері қолданбаны іске қосатын орталық орын болып табылады. Яғни, laravel негізгі қызметтері және қолданба қызметтері, сыныптар және олардың тәуелділіктері провайдерлер арқылы қызмет контейнеріне жіберіледі. 

Басқаша айтқанда, қызмет көрсетушілер біз 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'.
  • Соңында, барлық қызмет жеткізушілері өңделгеннен кейін, Laravel жолды (маршрутты) талдауға, контроллерді іске қосуға, үлгілерді пайдалануға және т.б.

Қызмет жеткізушілері Laravel predefiniti

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.phproutes/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() әдісі

Register() әдісі бізге мүмкіндік береді defiбіздің қызмет контейнеріне сілтемелер. Мысалы, келесі кодта:

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

$this->app — синглтон класы қолданба арқылы қол жеткізе алатын laravelдегі жаһандық айнымалы.

Синглтон - бұл ерекшелік. Бұл мүмкіндікті қолдану кезінде біз қолданбаға параметр ретінде қолданбадағы кез келген сыныптың бүкіл қолданбада тек бір данасы болуы керек екенін хабарлаймыз. Бұл MyClass бір рет шешілетінін және my_class айнымалысы арқылы қол жеткізуге болатын бір ғана данасы болатынын білдіреді.

boot() әдісі

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

Сондай-ақ сізді қызықтыруы мүмкін:

Инновациялық ақпараттық бюллетень
Инновация туралы ең маңызды жаңалықтарды жіберіп алмаңыз. Оларды электрондық пошта арқылы алу үшін тіркеліңіз.

Соңғы мақалалар

Баспагерлер мен OpenAI жасанды интеллект өңдейтін ақпарат ағынын реттеу үшін келісімдерге қол қояды.

Өткен дүйсенбіде Financial Times OpenAI-мен келісім туралы жариялады. FT өзінің әлемдік деңгейдегі журналистикасына лицензия береді…

30 Сәуір 2024

Онлайн төлемдер: Міне, ағынды қызметтер сізге мәңгілік төлем жасауға мүмкіндік береді

Миллиондаған адамдар ай сайынғы абоненттік төлемді төлей отырып, ағынды қызметтерге ақы төлейді. Жалпы пікір, сіз…

29 Сәуір 2024

Veeam қорғаныстан жауап беруге және қалпына келтіруге дейін төлемдік бағдарламалық құралға ең жан-жақты қолдау көрсетеді

Veeam ұсынған Coveware кибербопсалау оқиғаларына жауап беру қызметтерін көрсетуді жалғастырады. Coveware криминалистикалық және қалпына келтіру мүмкіндіктерін ұсынады ...

23 Сәуір 2024

Жасыл және цифрлық революция: болжамды техникалық қызмет көрсету мұнай және газ саласын қалай өзгертеді

Болжалды техникалық қызмет көрсету зауытты басқаруға инновациялық және белсенді көзқараспен мұнай және газ секторында төңкеріс жасайды.…

22 Сәуір 2024

Инновацияны өз тіліңізде оқыңыз

Инновациялық ақпараттық бюллетень
Инновация туралы ең маңызды жаңалықтарды жіберіп алмаңыз. Оларды электрондық пошта арқылы алу үшін тіркеліңіз.

Артымыздан