Հոդվածներ

Ծառայությունների մատակարարները Laravel-ում. ինչ են նրանք և ինչպես օգտագործել Ծառայությունների մատակարարները Laravel-ում

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 բեռնված են? 

Դրանք են definites զանգվածում 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 նախdefiniti

I Service Providers ներառված են Laravel-ում, բոլոր նրանք են, ովքեր ներկա են թղթապանակում app/Providers:

  • AppServiceProvider
  • AuthServiceProvider
  • BroadcastServiceProvider
  • EventServiceProvider
  • RouteServiceProvider

Դրանք բոլորը PHP դասեր են, որոնցից յուրաքանչյուրը կապված է իր թեմայի հետ. App, Auth, Broadcasting, Events e Routes. Բայց նրանք բոլորն ունեն մեկ ընդհանուր բան՝ մեթոդը boot().

Այդ մեթոդի ներսում մենք կարող ենք գրել ցանկացած կոդ՝ կապված այդ բաժիններից որևէ մեկի հետ. auth, events, routeև այլն։ Այլ կերպ ասած, Ծառայություններ Մատակարարները պարզապես դասեր են՝ գրանցելու որոշ գլոբալ ֆունկցիոնալություն:

Նրանք առանձնացված են որպես «մատակարարներ», քանի որ դրանք գործում են հավելվածի կյանքի ցիկլի շատ վաղ շրջանում, ուստի ինչ-որ գլոբալ բան հարմար է այստեղ, նախքան կատարող սկրիպտը կհասնի Models կամ Controllers:

Գործառույթների մեծ մասը գտնվում է 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() մեթոդը մեզ թույլ է տալիս definish հղումներ մեր ծառայության կոնտեյների: Օրինակ, հետևյալ կոդում.

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

$this->app-ը գլոբալ փոփոխական է laravel-ում, որին կարող է օգտվել singleton դասը հավելվածի միջոցով:

Singleton-ը հատկանիշ է: Այս հատկությունը կիրառելիս մենք հավելվածին տեղեկացնում ենք, որ հավելվածում որպես պարամետր փոխանցված ցանկացած դաս պետք է ունենա միայն մեկ օրինակ ամբողջ հավելվածում։ Սա նշանակում է, որ 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

Ձեզ նույնպես կարող է հետաքրքրել.

Նորարարության տեղեկագիր
Բաց մի թողեք նորարարության մասին ամենակարևոր նորությունները: Գրանցվեք դրանք էլփոստով ստանալու համար:

Վերջին հոդվածները

Նորարարական միջամտություն ընդլայնված իրականության մեջ, Apple-ի դիտողի հետ Կատանիայի պոլիկլինիկայում

Կատանիայի պոլիկլինիկայում ակնաբուժական վիրահատություն է կատարվել Apple Vision Pro գովազդային հեռուստադիտողի միջոցով…

3 Մայիս 2024

Երեխաների գունազարդման էջերի առավելությունները՝ կախարդական աշխարհ բոլոր տարիքի համար

Գունավորելու միջոցով նուրբ շարժիչ հմտությունների զարգացումը երեխաներին պատրաստում է ավելի բարդ հմտությունների, ինչպիսին է գրելը: Գունավորելու…

2 Մայիս 2024

Ապագան այստեղ է. Ինչպես է բեռնափոխադրման արդյունաբերությունը հեղափոխում համաշխարհային տնտեսությունը

Ծովային ոլորտը իսկական համաշխարհային տնտեսական տերություն է, որը նավարկվել է դեպի 150 միլիարդանոց շուկա...

1 Մայիս 2024

Հրատարակիչները և OpenAI-ը ստորագրում են համաձայնագրեր՝ արհեստական ​​ինտելեկտի կողմից մշակվող տեղեկատվության հոսքը կարգավորելու համար

Անցյալ երկուշաբթի Financial Times-ը հայտարարեց OpenAI-ի հետ գործարքի մասին: FT-ն արտոնագրում է իր համաշխարհային մակարդակի լրագրությունը…

30 Ապրիլ 2024

Կարդացեք նորարարությունը ձեր լեզվով

Նորարարության տեղեկագիր
Բաց մի թողեք նորարարության մասին ամենակարևոր նորությունները: Գրանցվեք դրանք էլփոստով ստանալու համար:

Հետեւեք մեզ