სხვა სიტყვებით რომ ვთქვათ, სერვისის პროვაიდერები ჰგავს ძაბრს, რომლის მეშვეობითაც ჩვენ ვასხამთ "კლასის" საწვავს ავზში, რომელსაც ეწოდება "სერვისის კონტეინერი" ძრავის სახელწოდებით 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'
.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.php
e routes/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() მეთოდი გვაძლევს საშუალებას definish ბმულები ჩვენი სერვისის კონტეინერზე. მაგალითად, შემდეგ კოდში:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app არის გლობალური ცვლადი laravel-ში, რომელსაც singleton კლასს შეუძლია წვდომა აპის მეშვეობით.
სინგლტონი თვისებაა. ამ ფუნქციის გამოყენებისას ჩვენ ვაცნობებთ აპლიკაციას, რომ აპლიკაციის პარამეტრად გადაცემული კლასი უნდა ჰქონდეს მხოლოდ ერთი ინსტანცია მთელ აპლიკაციაში. ეს ნიშნავს, რომ MyClass გადაიჭრება ერთხელ და ექნება მხოლოდ ერთი ეგზემპლარი, რომლის წვდომა შესაძლებელია my_class ცვლადის გამოყენებით.
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 Vision Pro კომერციული მაყურებლის გამოყენებით…
შეღებვის გზით მშვენიერი საავტომობილო უნარების განვითარება ბავშვებს ამზადებს უფრო რთული უნარებისთვის, როგორიცაა წერა. შეღებვა…
საზღვაო სექტორი ნამდვილი გლობალური ეკონომიკური ძალაა, რომელიც 150 მილიარდი ბაზრისკენ მიისწრაფვის...
გასულ ორშაბათს, Financial Times-მა გამოაცხადა გარიგება OpenAI-თან. FT ლიცენზირებს თავის მსოფლიო დონის ჟურნალისტიკას…