现在公司业务需要在C层的基础上添加一个services层,代替controller进行一部分业务处理.
所以我在app目录下新建了一个Services文件夹,然后在c层控制器里调用:
$services = App::make('要调用的service的完整类名');
这样虽然可以获取到services文件夹里指定的类了,但是如果这个类的构造函数需要参数则完全无法传递.
我尝试过这样写:
controller层:
public function test(){
$services = \App::make('App\Services\Servicetest',[1,2]);
$services->test();
}
在app/services目录下的Servicetest.php里这样写:
public function __construct($a, $b){
echo $a;
echo $b;
echo 111;
exit;
}
public function test(){
echo '成功';
}
很奇怪,在通过make方法获取实例化对象$services的时候,没有触发他的__construct()构造函数,没有输出$a,$b和111,但是$services->test()却成功执行了,输出了'成功'.
如果是这样,请问各位大神,如果我希望在controller中引入和执行services文件夹下的类来分担一部分业务逻辑的实现,我要怎么引入呢?我觉得App::make()这个方法是很好的,不需要手动require,直接获取到了实例化对象,可是为什么成功得到了实例化对象但是却没有执行构造函数输出111呢?我到底怎么才能在c层通过App::make()来传入参数给services层的构造函数呢?
期待大家的帮助,谢谢各位大神了.
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 ?