Maintenant, l'activité de l'entreprise doit ajouter une couche de services basée sur la couche C pour remplacer le contrôleur pour une partie du traitement métier
J'ai donc créé un nouveau dossier Services dans le répertoire de l'application, puis j'ai appelé le c. contrôleur de couche :
$services = App::make('Le nom complet de la classe du service à appeler');
Bien que la classe spécifiée dans le dossier services puisse être obtenue, si le constructeur de cette classe nécessite des paramètres, elle ne peut pas être transmise du tout.
J'ai essayé d'écrire comme ceci :
couche de contrôleur :
public function test(){
$services = \App::make('App\Services\Servicetest',[1,2]);
$services->test();
}
Écrivez ceci dans Servicetest.php dans le répertoire app/services :
public function __construct($a, $b){
echo $a;
echo $b;
echo 111;
exit;
}
public function test(){
echo '成功';
}
Il est très étrange que lorsque l'objet instancié $services est obtenu via la méthode make, son constructeur __construct() n'est pas déclenché et $a, $b et 111 ne sont pas générés, mais $services->test() est-ce qu'il a été exécuté avec succès et « réussi » a été affiché
Si oui, pourriez-vous me dire si je souhaite introduire et exécuter les classes dans le dossier services du contrôleur pour partager la charge ? Comment introduire l'implémentation d'une partie de la logique métier ? Je pense que la méthode App::make() est très bonne. Elle ne nécessite pas d'exigence manuelle et obtient directement l'objet instancié. Mais pourquoi l'objet instancié est-il obtenu avec succès mais pas. Exécuter les sorties du constructeur 111 ? Comment puis-je transmettre des paramètres au constructeur de la couche services via App::make() sur la couche c ?
Dans l'attente de votre aide, merci à tous.
Je ne sais pas comment vous avez réussi. Au moins, j'ai suivi votre approche et l'ai testée localement, mais cela n'a pas abouti (mon Laravel est en version 5.4).
J'ai également regardé le code associé de
App::make('className')
Tout d'abord, cette méthode ne prend pas en charge la transmission de paramètres à la méthode constructeur.App::make('className')
相关的代码, 首先该方法不支持为构造方法传参数。如果需要向构造方法传参数,请使用
App::makeWith('className', [param1, param2, ...])
。其代码实现是利用反射,检查构造函数是否需要传参数:
3, si nécessaire. Si un paramètre est passé, et le paramètre est un paramètre qui ne peut pas être instancié (par exemple, une variable sans indice de type, l'indice de type est un entier, une chaîne, une virgule flottante, etc.), puis vérifiez s'il existe un paramètre par défaut, et s'il y a un paramètre par défaut, passez le paramètre par défaut. Allez au constructeur, s'il n'y a pas de paramètres par défaut, une exception sera levée, comme indiqué ci-dessous : 🎜🎜🎜🎜🎜1,如果不需要传参数,则直接实例化
2,如果需要传参数,且参数为可实例化的类,则尝试实例化该类(循环进入
App::make
或App::makeWith()
Si vous devez transmettre des paramètres au constructeur, veuillez utiliser
App::makeWith('className', [param1, param2, ...])
.L'implémentation du code utilise la réflexion pour vérifier si le constructeur doit transmettre des paramètres : 1. Si aucun paramètre n'est requis, instancier directement 2. Si les paramètres doivent être transmis et que les paramètres sont des classes instanciables, essayez d'instancier cette classe (boucle). dans la logique de
App::make
ouApp::makeWith()
), et passez la classe instanciée en paramètreOubliez directement la classe statique. J'ai découvert plus tard qu'elle devait être instanciée à chaque fois. Bien que l'instanciation automatique soit injectée dans le contrôleur, son appel à d'autres endroits doit être effectué manuellement, donc tout est classé statique par moi. . . . .
L'injection de dépendances ne peut-elle pas résoudre le problème ?