Maison  >  Article  >  développement back-end  >  Problèmes rencontrés lors du développement et de la configuration du chargement différé dans le fournisseur de services Laravel

Problèmes rencontrés lors du développement et de la configuration du chargement différé dans le fournisseur de services Laravel

小云云
小云云original
2018-01-08 10:11:141662parcourir

Cet article vous présente principalement les problèmes rencontrés lors du développement et de la configuration du chargement paresseux dans le fournisseur de services Laravel. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur de référence et d'apprentissage pour les études ou le travail de chacun. si besoin, cela peut suivre. Jetons un coup d'œil avec l'éditeur. J'espère que cela aide tout le monde.

Avant-propos

Cet article présente principalement certains problèmes rencontrés lors de la configuration du chargement paresseux dans Laravel Service Provider. Tout cet article est dû aux besoins réels du projet. Récemment, je développe laravel-database-Quand. en utilisant le package logger, j'ai découvert que définir l'attribut ServiceProvider defer sur true rendrait invalide le middleware enregistré dans la méthode de registre.

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 protégé $defer = true ; la classe d'invite de base de données est introuvable., indiquant que Laravel n'a pas enregistré ce ServiceProvder

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

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

Enregistrez votre propre ServiceProvider dans l'AppServiceProvider normalement enregistré

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

Après l'enregistrement, tout est normal.

2. Étudiez le code source

L'enregistrement du fournisseur dans config/app.php n'est pas valide, mais l'enregistrement dans d'autres fournisseurs de services est valide, indiquant un autre problème.

Trouvez la méthode registerConfiguredProviders en étudiant le code source d'IlluminateFoundationApplication :

Laravel lit le contenu des fournisseurs dans config/app.php dans cette méthode et le charge dans ProviderRepository.

(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath()))
     ->load($providers->collapse()->toArray());

L'accent est mis sur $this->getCachedServicesPath() Grâce au code source, nous avons constaté que Laravel détermine comment enregistrer le ServiceProvider en fonction du fichier bootstrap/cache/services.php.

À ce moment-là, j'ai réfléchi à la raison pour laquelle le code //protected $defer = true; était toujours invalide après l'avoir commenté auparavant.

Donc, pour que le code commenté //protected $defer = true; soit efficace, vous devez exécuter

php artisan clear-compiled 
php artisan optimize

Après cela, le problème est résolu et vous avez une analyse plus approfondie. compréhension du principe de ServiceProvider.

Alors rappelez-vous : si vous envisagez d'utiliser le chargement différé de ServiceProvider, 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 defer, vous devez exécuter php artisan clear-compiled et php artisan optimise pour mettre à jour le cache ServiceProvider.

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

C'est simple car AppServiceProvider ne retarde pas le chargement, donc exécuter la méthode de registre dans AppServiceProvider pour enregistrer un nouveau ServiceProvider ne retardera pas le chargement.

Résumé

Utilisez le chargement paresseux de ServiceProvider avec prudence

Après avoir modifié la valeur de l'attribut defer, vous devez exécuter php artisan clear-compiled et php artisan optimiser pour mettre à jour le cache ServiceProvider.

Il est strictement interdit d'enregistrer un middleware et un routage dans un ServiceProvider chargé paresseux.

Recommandations associées :

Problème des fournisseurs de services Laravel

Les fournisseurs de services Laravel lient plusieurs implémentations. Que dois-je faire lorsque l'injection de dépendances est utilisée. ? Déterminer quelle classe est instanciée ?

Solutions du fournisseur de services Laravel aux problèmes rencontrés lors de la configuration du chargement paresseux pendant le développement

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