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

Explication détaillée des problèmes rencontrés lors de la configuration du chargement différé lors du développement du fournisseur de services Laravel

jacklove
jackloveoriginal
2018-07-03 17:50:032625parcourir

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.

Articles qui pourraient vous intéresser :

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!

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