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 d'apprentissage de référence pour les études ou le travail de tous les amis qui en ont besoin. Jetons un coup d'œil avec l'éditeur ci-dessous.
Préface
Cet article présente principalement certains problèmes rencontrés lors de la configuration du chargement paresseux dans le fournisseur de services Laravel. L'ensemble de cet article est dû à des éléments réels. besoins du projet, lors du développement récent du package laravel-database-logger, j'ai découvert que définir l'attribut defer de ServiceProvider 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 s'est produit, je soupçonnais qu'il était dû à la définition de l'attribut defer sur true, j'ai donc immédiatement modifié le code source et changé le code de protected $defer = true;
Commentez-le, et le résultat est toujours une invite databaselogger class not found.
, indiquant que Laravel n'a pas enregistré ce ServiceProvder
L'étape suivante est de savoir comment résoudre ce problème, et j'ai essayé la méthode suivante :
1. Vérifiez s'il y a des problèmes avec votre propre code
Enregistrez votre propre fournisseur de services dans l'AppServiceProvider normalement enregistré
public function register() { // $this->app->register(\Ibrand\DatabaseLogger\ServiceProvider::class); }
Après l'inscription, tout s'est bien passé.
2. Étudiez le code source
L'enregistrement du fournisseur dans config/app.php n'est pas valide, mais l'enregistrement dans un autre ServiceProvider est valide. L'explication concerne d'autres problèmes.
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());
Le point clé est $this->getCachedServicesPath()
Grâce au code source, nous avons constaté que Laravel décide comment enregistrer le fournisseur de services en fonction du bootstrap/du cache. Fichier /services.php.
À ce moment-là, j'ai réfléchi à la raison pour laquelle le code //protected $defer = true;
précédemment commenté était toujours invalide.
Donc, pour rendre le code //protected $defer = true;
commenté 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 compréhension plus approfondie 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, php artisan clear-compiled
et php artisan optimize
doivent être exécutés pour mettre à jour le cache ServiceProvider.
3. Pourquoi l'inscription dans AppServiceProvider est-elle valide ?
C'est facile 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 différé 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 optimize
pour mettre à jour le cache ServiceProvider.
Il est strictement interdit d'enregistrer un middleware et un routage dans un ServiceProvider chargé paresseux.
PHP implémente un algorithme de tri par tas
PHP Apprentissage de l'algorithme de tri par sélection simple
Explication détaillée de l'implémentation du code PHP WeChat Tiaoyitiao
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!