Другим речима, пружаоци услуга су као левак кроз који сипамо гориво „класе” у резервоар који се зове „сервисни контејнер” мотора који се зове Ларавел.
Ако отворимо цонфиг/апп.пхп, видећемо низ са именом "провајдер"
'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,
.
.
.
],
Ово су неки од провајдера услуга који се пружају заједно са ларавел-ом, односно основним сервисима који су смештени у сервисни контејнер.
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
укључени у Ларавел, да ли су сви они присутни у фасцикли app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Све су то ПХП класе, свака повезана са својом темом: App
, Auth
, Broadcasting
, Events
e Routes
. Али сви имају једну заједничку ствар: метод boot()
.
Унутар те методе можемо написати било који код који се односи на било који од ових одељака: auth
, events
, route
, итд. Другим речима, добављачи услуга су само класе за регистровање неке глобалне функционалности.
Они су одвојени као „провајдери“ јер се покрећу веома рано у животном циклусу апликације, тако да је нешто глобално овде згодно пре него што извршна скрипта дође до модела или контролера.
Већина функционалности је у РоутеСервицеПровидер, ево кода:
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
за све 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
, говори о онемогућавању лењог учитавања у Елокуент-у. Да бисте то урадили, само требате додајте два реда у методу boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Ово ће изазвати изузетак ако модел односа није учитан.
service provider
обичајПоред пред фајловаdefiните, лако можемо створити нову 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()
{
//
}
}
Као што видимо унутра постоје две методе:
Метод регистер() нам омогућава да defiвише линкова до нашег контејнера за услуге. На пример, у следећем коду:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$тхис->апп је глобална варијабла у ларавел-у којој синглетон класа може да приступи преко апликације.
Синглтон је карактеристика. Када примењујемо ову функцију, обавештавамо апликацију да било која класа која се проследи као параметар у апликацији треба да има само једну инстанцу у целој апликацији. То значи да ће МиЦласс бити разрешен једном и да ће имати само једну инстанцу којој се може приступити помоћу променљиве ми_цласс.
Метода боот() вам омогућава да приступите свим услугама које су претходно регистроване помоћу методе регистра. Затим можете укључити целу услугу у своју апликацију користећи овај метод.
Враћајући се на претходни пример, хајде да уклонимо метод register()
и унутар boot()
додајте код Бладе директиве:
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
, ево исечка са званичног сајта Ларавел :
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
Можда ће вас занимати и:
Поморски сектор је права глобална економска сила, која је кренула ка тржишту од 150 милијарди...
Прошлог понедељка, Финанциал Тимес је објавио договор са ОпенАИ. ФТ лиценцира своје новинарство светске класе…
Милиони људи плаћају услуге стриминга, плаћајући месечне претплате. Увријежено је мишљење да сте…
Цовеваре од Вееам-а ће наставити да пружа услуге одговора на инциденте са сајбер изнудом. Цовеваре ће понудити форензику и могућности санације…