Články

Poskytovatelé služeb v Laravel: co to jsou a jak používat poskytovatele služeb v Laravelu

Poskytovatelé služeb Laravel jsou centrálním místem, kde se aplikace spouští. To znamená, že základní služby laravel a aplikační služby, třídy a jejich závislosti jsou vtlačeny do kontejneru služeb prostřednictvím poskytovatelů. 

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.

příklad

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.

Když já 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ánku

který 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:

  • První iterace hledá volitelnou metodu register(), užitečné pro (případně) provedení něčeho nakonfigurovaného před metodou boot().
  • druhá iterace provede metodu boot() všech poskytovatelů. Opět jeden po druhém, shora dolů, pole 'providers'.
  • Nakonec, po zpracování všech poskytovatelů služeb, Laravel přejde k analýze cesty (trasy), spuštění ovladače, použití šablon atd.

Poskytovatelé služeb Laravel predefiniti

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.phproutes/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():

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.
// 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.

Vytvořte si vlastní service provider přizpůsobili

Kromě 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 Bladea 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().

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().

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:

Inovační zpravodaj
Nenechte si ujít nejdůležitější novinky o inovacích. Přihlaste se k jejich odběru e-mailem.

Nedávné články

Budoucnost je tady: Jak lodní průmysl revolucionizuje globální ekonomiku

Námořní sektor je skutečnou globální ekonomickou velmocí, která se dostala na 150miliardový trh...

1. května 2024

Vydavatelé a OpenAI podepisují dohody o regulaci toku informací zpracovávaných umělou inteligencí

Minulé pondělí Financial Times oznámily dohodu s OpenAI. FT licencuje svou prvotřídní žurnalistiku…

30. dubna 2024

Online platby: Zde je návod, jak vám streamovací služby umožňují platit navždy

Miliony lidí platí za streamovací služby a platí měsíční předplatné. Je obecný názor, že jste…

29. dubna 2024

Veeam nabízí nejkomplexnější podporu pro ransomware, od ochrany po reakci a obnovu

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…

23. dubna 2024