Me fjalë të tjera, ofruesit e shërbimeve janë si një gyp përmes të cilit ne derdhim karburantin "klas" në një rezervuar të quajtur "kontejner shërbimi" i një motori të quajtur Laravel.
Nëse hapim config/app.php, do të shohim një grup me emrin "ofruesi"
'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,
.
.
.
],
Këta janë disa nga ofruesit e shërbimeve të ofruara së bashku me laravel, pra shërbimet bazë të cilat vendosen në kontejnerin e shërbimit.
service provider
a kryhen?Nëse shikojmë dokumentacionin cikli jetësor sipas kërkesës , skedarët e mëposhtëm ekzekutohen në fillim:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
dhe të tijat Middlewares
Service Providers
: përmbajtja e këtij artikulliquali service provider
janë të ngarkuara?
Ata janë ata definites në grup 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,
],
];
Siç mund ta shohim, ekziston një listë e service provider
jo publike në dosje /vendor
, nuk duhet as t'i prekim dhe as t'i modifikojmë. Ato që na interesojnë janë më poshtë, me BroadcastServicerProvider
i çaktivizuar si parazgjedhje, ndoshta sepse përdoret rrallë.
Të gjithë këta ofrues shërbimesh shkojnë nga lart poshtë, duke përsëritur listën dy herë:
register()
, i dobishëm për (përfundimisht) ekzekutimin e diçkaje të konfiguruar përpara metodës boot()
.boot()
e të gjithë ofruesve. Përsëri, një nga një, nga lart poshtë, të grupit 'providers'
.I Service Providers
të përfshira në Laravel, janë të gjithë ata që janë të pranishëm në dosje app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Ato janë të gjitha klasa PHP, secila e lidhur me temën e vet: App
, Auth
, Broadcasting
, Events
e Routes
. Por të gjithë kanë një gjë të përbashkët: metodën boot()
.
Brenda kësaj metode, ne mund të shkruajmë çdo kod që lidhet me cilindo nga ato seksione: auth
, events
, route
, etj. Me fjalë të tjera, Ofruesit e Shërbimeve janë thjesht klasa për të regjistruar disa funksione globale.
Ato janë të ndara si "ofruesit" sepse funksionojnë shumë herët në ciklin e jetës së aplikacionit, kështu që diçka globale është e përshtatshme këtu përpara se skripti ekzekutues të kalojë te Modelet ose Kontrollorët.
Shumica e funksionalitetit është në RouteServiceProvider, këtu është kodi:
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());
});
}
}
Kjo është klasa ku janë konfiguruar skedarët route
, Me routes/web.php
e routes/api.php
përfshirë si parazgjedhjedefinita. Vini re se për API ka edhe konfigurime të ndryshme: prefiksi i pikës fundore /api
dhe pajisje të mesme api
per te gjithe routes
.
Ne mund të modifikojmë service providers
, të cilat nuk janë në dosje /vendor
. Përshtatja e këtyre skedarëve bëhet kur keni shumë shtigje dhe dëshironi t'i ndani në skedarë të veçantë. Ju krijoni routes/auth.php
dhe vendosni shtigjet atje, pastaj "aktivizoni" atë skedar në metodë boot()
di RouteServiceProvider
, thjesht shtoni fjalinë e tretë:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
është e shprazur. Një shembull tipik i shtimit të kodit AppServiceProvider
, ka të bëjë me çaktivizimin e ngarkimit dembel në Eloquent. Për ta bërë këtë, ju vetëm duhet shtoni dy rreshta në metodën boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Kjo do të bëjë një përjashtim nëse një model marrëdhëniesh nuk ngarkohet.
service provider
përshtaturPërveç skedarëve paraprakdefinites, ne mund të krijojmë lehtësisht një të re Service Provider
, lidhur me tema të tjera nga ato paradefipërfunduar si auth
/event
/routes
.
Një shembull mjaft tipik është konfigurimi i pamjes Blade
. Ne mund të krijojmë një direktivë Blade
, dhe më pas shtoni atë kod në metodë boot(
) të ndonjë service provider
, duke përfshirë parazgjedhjen AppServiceProvider
. Le të krijojmë tani një ViewServiceProvider
veçuar.
Mund ta gjenerojmë me këtë komandë:
php artisan make:provider ViewServiceProvider
E cila do të gjenerojë klasën aq paradefinata:
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()
{
//
}
}
Siç mund ta shohim brenda, ekzistojnë dy mënyra:
Metoda register() na lejon defilidhjet nish në kontejnerin tonë të shërbimit. Për shembull, në kodin e mëposhtëm:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app është një variabël globale në laravel që një klasë singleton mund t'i qaset përmes aplikacionit.
Singleton është një veçori. Kur aplikoni këtë veçori, ne po informojmë aplikacionin se cilado klasë që kalohet si parametër në aplikacion duhet të ketë vetëm një shembull në të gjithë aplikacionin. Kjo do të thotë që MyClass do të zgjidhet një herë dhe do të ketë vetëm një shembull, i cili mund të aksesohet duke përdorur variablin my_class.
Metoda boot() ju lejon të aksesoni të gjitha shërbimet e regjistruara më parë duke përdorur metodën e regjistrimit. Më pas mund të përfshini të gjithë shërbimin në aplikacionin tuaj duke përdorur këtë metodë.
Duke u kthyer te shembulli i mëparshëm, le të heqim metodën register()
dhe brenda boot()
shtoni kodin e direktivës Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Një shembull tjetër i ViewServiceProvider
ka të bëjë View Composers
, këtu është fragmenti nga faqja zyrtare e 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) {
//
});
}
}
Për të ekzekutuar, ky ofrues i ri duhet të shtohet/regjistrohet në grupin e ofruesit në 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
Ju gjithashtu mund të jeni të interesuar në:
Zhvillimi i aftësive të shkëlqyera motorike përmes ngjyrosjes i përgatit fëmijët për aftësi më komplekse si shkrimi. Për të ngjyrosur…
Sektori detar është një fuqi e vërtetë ekonomike globale, e cila ka lundruar drejt një tregu prej 150 miliardë...
Të hënën e kaluar, Financial Times njoftoi një marrëveshje me OpenAI. FT licencon gazetarinë e saj të klasit botëror…
Miliona njerëz paguajnë për shërbimet e transmetimit, duke paguar tarifat mujore të abonimit. Është e zakonshme që ju…