X

Chargement conditionnel des fournisseurs de services dans Laravel 5


Depuis que Laravel 5 a aplati de nombreuses structures spécifiques à l’environnement, une grande partie de la configuration qui était autrefois stockée dans différents répertoires de configuration pour chaque environnement a maintenant été déplacée vers .env des dossiers.

Mais celui qui ne peut pas simplement vivre dedans .env est la charge dépendante de l’environnement des fournisseurs de services.

Sur un projet sur lequel nous travaillons, nous souhaitons enregistrer nos gestionnaires d’erreurs auprès de fournisseurs de services, et nous souhaitons enregistrer un gestionnaire d’erreurs différent en fonction de l’environnement. Nous avons deux: ProductionErrorHandler et VerboseErrorHandlerdont le second est destiné aux environnements de développement.

Charger les fournisseurs de services normalement

Si vous n’êtes pas familier, la définition des fournisseurs de services normaux (non spécifiques à l’environnement) se produit dans /config/app.php. Il y a un providers tableau là qui ressemble un peu à ceci:

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        'Illuminate\Foundation\Providers\ArtisanServiceProvider',
        'Illuminate\Auth\AuthServiceProvider',
        'Illuminate\Bus\BusServiceProvider',
        ...
    ]

Donc, si votre fournisseur de services doit être chargé dans chaque environnementil suffit de le jeter dans ce tableau et vous êtes prêt à partir.

Chargement conditionnel des prestataires de services

Cependant, si vous voulez le rendre conditionnel, vous devrez vous diriger vers /app/Providers/AppServiceProvider.php. Ce fichier est l’endroit général où vous allez vouloir démarrer et enregistrer tout ce qui n’est pas géré par un autre fournisseur de services, c’est donc un endroit où vous pouvez aller pour enregistrer conditionnellement vos fournisseurs de services.

Voici à quoi ça ressemble en ce moment :

<?php namespace app\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * This service provider is a great spot to register your various container
     * bindings with the application. As you can see, we are registering our
     * "Registrar" implementation here. You can add your own bindings too!
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            'Illuminate\Contracts\Auth\Registrar',
            'App\Services\Registrar'
        );
    }
}

Alors, faisons notre changement.

    // AppServiceProvider.php

    public function register()
    {
        $this->app->bind(
            'Illuminate\Contracts\Auth\Registrar',
            'App\Services\Registrar'
        );

        if ($this->app->environment('production')) {
            $this->app->register('App\Providers\ProductionErrorHandlerServiceProvider');
        } else {
            $this->app->register('App\Providers\VerboseErrorHandlerServiceProvider');
        }
    }

$this->app->register() configurera le fournisseur de services comme si vous l’ajoutiez à config/app.php va, donc c’est register() et boot() les méthodes seront appelées aux moments appropriés.

Vous pouvez également utiliser switch au lieu de if, ou vous pouvez faire votre travail en fonction d’autres variables d’environnement, ou quoi que ce soit d’autre – mais c’est votre meilleur pari actuel pour charger conditionnellement les fournisseurs de services. J’espère que cela t’aides!