არტიკოლი

სერვისის პროვაიდერები 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 ისინი დატვირთულია? 

ესენი არიან defiნიტები მასივში 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და ა.შ. სხვა სიტყვებით რომ ვთქვათ, სერვისის პროვაიდერები მხოლოდ კლასები არიან, რათა დაარეგისტრირონ გარკვეული გლობალური ფუნქციონირება.

ისინი განცალკევებულნი არიან, როგორც „პროვაიდერები“, რადგან ისინი მუშაობენ აპლიკაციის სასიცოცხლო ციკლის ძალიან ადრეულ ეტაპზე, ასე რომ, აქ რაღაც გლობალური მოსახერხებელია, სანამ შემსრულებელი სკრიპტი მოდელებსა და კონტროლერებში მოხვდება.

ფუნქციების უმეტესი ნაწილი არის 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-ში lazy loading-ის გამორთვა. ამისათვის თქვენ უბრალოდ გჭირდებათ დაამატეთ ორი ხაზი მეთოდში 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

რაც გამოიმუშავებს კლასს ისე წინასწარdefinite:

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 კლასს შეუძლია წვდომა აპის მეშვეობით.

სინგლტონი თვისებაა. ამ ფუნქციის გამოყენებისას ჩვენ ვაცნობებთ აპლიკაციას, რომ აპლიკაციის პარამეტრად გადაცემული კლასი უნდა ჰქონდეს მხოლოდ ერთი ინსტანცია მთელ აპლიკაციაში. ეს ნიშნავს, რომ 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

წაიკითხეთ ინოვაცია თქვენს ენაზე

საინფორმაციო ბიულეტენი
არ გამოტოვოთ ყველაზე მნიშვნელოვანი სიახლეები ინოვაციების შესახებ. დარეგისტრირდით, რომ მიიღოთ ისინი ელექტრონული ფოსტით.

Follow us