Maison >développement back-end >tutoriel php >Problèmes rencontrés lors du développement et de la configuration du chargement différé dans le fournisseur de services Laravel
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
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!