Jinými slovy, poskytovatelé služeb jsou jako trychtýř, kterým naléváme palivo „třídy“ do nádrže zvané „servisní nádoba“ motoru zvaného Laravel.
Pokud otevřeme config/app.php, uvidíme pole s názvem „provider“
'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,
.
.
.
],
Jedná se o některé z poskytovatelů služeb poskytovaných společně s laravel, tedy základními službami, které jsou umístěny v servisním kontejneru.
service provider
jsou prováděny?Když se podíváme do dokumentace na vyžádání životního cyklu , na začátku jsou spuštěny následující soubory:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
a jeho Middlewares
Service Providers
: Obsah tohoto článkukterý service provider
jsou nabité?
To jsou oni definites v poli 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,
],
];
Jak vidíme, existuje seznam service provider
není ve složce veřejné /vendor
, neměli bychom se jich dotýkat ani je upravovat. Ti, kteří nás zajímají, jsou níže, s BroadcastServicerProvider
ve výchozím nastavení zakázáno, pravděpodobně proto, že se používá zřídka.
Všichni tito poskytovatelé služeb běží shora dolů a opakují seznam dvakrát:
register()
, užitečné pro (případně) provedení něčeho nakonfigurovaného před metodou boot()
.boot()
všech poskytovatelů. Opět jeden po druhém, shora dolů, pole 'providers'
.I Service Providers
součástí Laravelu jsou všichni přítomní ve složce app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Jsou to všechny třídy PHP, z nichž každá souvisí s vlastním tématem: App
, Auth
, Broadcasting
, Events
e Routes
. Ale všechny mají jedno společné: metodu boot()
.
Uvnitř této metody můžeme napsat libovolný kód související s kteroukoli z těchto sekcí: auth
, events
, route
, atd. Jinými slovy, poskytovatelé služeb jsou jen třídy pro registraci některých globálních funkcí.
Jako „poskytovatelé“ jsou odděleni, protože se spouštějí velmi brzy v životním cyklu aplikace, takže něco globálního se zde hodí, než se spouštěcí skript dostane k modelům nebo ovladačům.
Většina funkcí je v RouteServiceProvider, zde je kód:
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());
});
}
}
Toto je třída, kde se konfigurují soubory route
, S routes/web.php
e routes/api.php
zahrnuto ve výchozím nastavenídefinita. Všimněte si, že pro API existují také různé konfigurace: Endpoint prefix /api
a middleware api
pro všechny routes
.
Můžeme upravit service providers
, které nejsou ve složce /vendor
. Přizpůsobení těchto souborů se provádí, když máte mnoho cest a chcete je rozdělit do konkrétních souborů. Vy tvoříte routes/auth.php
a vložte tam cesty, pak tento soubor "povolíte" v metodě boot()
di RouteServiceProvider
, stačí přidat třetí větu:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
je to prázdné. Typický příklad přidávání kódu AppServiceProvider
, je o deaktivaci líného načítání v Eloquent . K tomu stačí přidat dva řádky v metodě boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
To vyvolá výjimku, pokud není načten model vztahu.
service provider
přizpůsobiliKromě předsouborůdefinites, můžeme snadno vytvořit nový Service Provider
, související s jinými tématy, než jsou předdefiskončil jako auth
/event
/routes
.
Poměrně typickým příkladem je konfigurace pohledu Blade
. Můžeme vytvořit směrnici Blade
a poté přidejte tento kód do metody boot(
) jakéhokoli service provider
, včetně výchozího AppServiceProvider
. Nyní vytvoříme a ViewServiceProvider
odděleně.
Můžeme jej vygenerovat pomocí tohoto příkazu:
php artisan make:provider ViewServiceProvider
Což vygeneruje třídu tak predefinoc:
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()
{
//
}
}
Jak vidíme uvnitř, existují dva způsoby:
Metoda register() nám to umožňuje definish odkazy na náš servisní kontejner. Například v následujícím kódu:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app je globální proměnná v laravel, ke které má třída singleton přístup prostřednictvím aplikace.
Singleton je funkce. Při použití této funkce informujeme aplikaci, že jakákoli třída předaná jako parametr v aplikaci by měla mít pouze jednu instanci v celé aplikaci. To znamená, že MyClass bude vyřešen jednou a bude mít pouze jednu instanci, ke které lze přistupovat pomocí proměnné my_class.
Metoda boot() vám umožňuje přistupovat ke všem dříve registrovaným službám pomocí metody register. Pomocí této metody pak můžete do své aplikace zahrnout celou službu.
Vraťme se k předchozímu příkladu a odeberte metodu register()
a uvnitř boot()
přidejte kód direktivy Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Další příklad ViewServiceProvider
se jedná o View Composers
, zde je úryvek z oficiálních stránek 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) {
//
});
}
}
Ke spuštění musí být tento nový poskytovatel přidán/registrován do pole poskytovatelů in 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
Mohlo by vás také zajímat:
Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...
Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…
Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…
Společnost Coveware od společnosti Veeam bude i nadále poskytovat služby reakce na incidenty v oblasti kybernetického vydírání. Coveware nabídne forenzní a sanační schopnosti…