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 AppServiceProvider
ServiceProvider
public function register() { // $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class); }
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
en étudiant le code source IlluminateFoundationApplication
: registerConfiguredProviders
dans config/app.php
et providers
vers load
milieu. ProviderRepository
(new ProviderRepository($this, new Filesystem, $this->getCachedServicesPath())) ->load($providers->collapse()->toArray());
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
ne fonctionnait toujours pas après l'avoir commenté auparavant. //protected $defer = true;
commenté efficace, vous devez exécuter //protected $defer = true;
php artisan clear-compiled php artisan optimize
, 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'attributServiceProvider
, vous devez exécuterdefer
etphp 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
ServiceProvider
, vous devez pour exécuter defer
et php artisan clear-compiled
pour mettre à jour le cache ServiceProvider. php artisan optimize
et ServiceProvider
en paresseux-chargé middleware
est strictement interdit. route
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!