Maison  >  Article  >  développement back-end  >  Solutions aux problèmes rencontrés lors de la configuration du chargement différé lors du développement du fournisseur de services Laravel

Solutions aux problèmes rencontrés lors de la configuration du chargement différé lors du développement du fournisseur de services Laravel

小云云
小云云original
2018-01-03 15:05:431799parcourir

Récemment, lors du développement du package laravel-database-logger, j'ai découvert que définir l'attribut ServiceProvider defer sur true rendrait invalide le register enregistré dans la méthode middleware. Cet article partage principalement avec vous les solutions aux problèmes rencontrés lors de la configuration du chargement différé lors du développement de Laravel Service Provider. J'espère qu'il pourra aider tout le monde.

class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
     protected $defer = true;
     
     public function register()
     {
        $this->mergeConfigFrom(
            __DIR__ . '/../config/config.php', 'ibrand.dblogger'
        );


        $this->app->singleton(DbLogger::class, function ($app) {
            return new DbLogger();
        });

        //当 $defer 设置为 true 时,在路由中引用 databaselogger middleware 会报错,提示 databaselogger class not found.
        $this->app[\Illuminate\Routing\Router::class]->middleware('databaselogger', Middleware::class);

    }
    
    public function provides()
    {
        return [DbLogger::class];
    }
}

Lorsque le problème est survenu, j'ai soupçonné qu'il était dû à la définition de l'attribut defer sur true. J'ai immédiatement modifié le code source et commenté le code protected $defer = true;. toujours une invitedatabaselogger class not found., indiquant que Laravel n'a pas enregistré cela ServiceProvder

L'étape suivante consiste à savoir comment résoudre ce problème. J'ai essayé la méthode suivante :

1. Vérifiez s'il y a un problème avec le code lui-même.

Enregistrez le vôtre AppServiceProviderServiceProvider

public function register()
    {
        //
        $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class);
    }
dans l'enregistrement normal

et tout sera normal après l'enregistrement.

2. Le code source de recherche
est invalide dans config/app.php enregistrement, mais valide dans d'autres providers, indiquant un autre problème. ServiceProvider

Trouvez la méthode

en étudiant le code source IlluminateFoundationApplication : registerConfiguredProviders

Laravel utilise cette méthode pour lire le contenu

dans config/app.php et providers vers load milieu. ProviderRepository

(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
                    ->load($providers->collapse()->toArray());
Le point clé est

Grâce au code source, nous avons constaté que Laravel décide comment enregistrer $this->getCachedServicesPath() en fonction du fichier bootstrap/cache/services.php. ServiceProvider

À ce moment-là, j'ai réfléchi à la raison pour laquelle le code

ne fonctionnait toujours pas après l'avoir commenté auparavant. //protected $defer = true;

Donc, pour rendre le code

commenté efficace, vous devez exécuter //protected $defer = true;

php artisan clear-compiled 
php artisan optimize
Après cela, le problème est résolu et vous avez une compréhension plus profonde du principe de. Fournisseur de services.

Alors rappelez-vous : si vous envisagez d'utiliser le chargement différé
, il est strictement interdit d'enregistrer un middleware, une route et d'autres séries d'opérations. Dans le même temps, après avoir modifié la valeur de l'attribut ServiceProvider, vous devez exécuter defer et php artisan clear-compiled pour mettre à jour le cache ServiceProvider. php artisan optimize

3. Pourquoi l'inscription dans AppServiceProvider est-elle valide ?

est facile car

n'est pas chargé paresseux, donc exécuter la méthode AppServiceProvider dans AppServiceProvider pour enregistrer un nouveau register ne sera pas chargé paresseux. ServiceProvider

Résumé

  1. Utilisez le chargement différé avec prudence

    ServiceProvider

  2. Après avoir modifié la valeur de l'attribut

    , vous devez pour exécuter defer et php artisan clear-compiled pour mettre à jour le cache ServiceProvider. php artisan optimize

  3. L'enregistrement de

    et ServiceProvider en paresseux-chargé middleware est strictement interdit. route

Recommandations associées :


Explication détaillée de la façon de créer un fournisseur de services et une façade dans laravel5

Problème des fournisseurs de services Laravel

Comment créer un fournisseur de services et une façade dans Laravel5


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn