现在公司业务需要在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层的构造函数呢?
期待大家的帮助,谢谢各位大神了.
당신이 어떻게 성공했는지는 모르겠지만 적어도 당신의 접근 방식을 따라 로컬에서 테스트했지만 실패했습니다(제 Laravel은 버전 5.4입니다).
App::make('className')
관련 코드도 살펴봤습니다. 우선 이 메소드는 생성자 메소드에 매개변수 전달을 지원하지 않습니다.App::make('className')
相关的代码, 首先该方法不支持为构造方法传参数。如果需要向构造方法传参数,请使用
App::makeWith('className', [param1, param2, ...])
。其代码实现是利用反射,检查构造函数是否需要传参数:
3으로 전달합니다. 필요한 경우 매개변수가 전달되는 경우, 매개변수가 인스턴스화할 수 없는 매개변수(예: 유형 힌트가 없는 변수, 유형 힌트가 정수, 문자열, 부동 소수점 등)인 경우 기본 매개변수가 있는지 추가로 확인하고, 기본 매개변수가 있는 경우 기본 매개변수를 전달합니다. 생성자로 이동합니다. 기본 매개변수가 없으면 아래와 같이 예외가 발생합니다. 🎜🎜🎜🎜🎜1,如果不需要传参数,则直接实例化
2,如果需要传参数,且参数为可实例化的类,则尝试实例化该类(循环进入
App::make
或App::makeWith()
생성자에 매개변수를 전달해야 하는 경우
App::makeWith('className', [param1, param2, ...])
를 사용하세요.코드 구현에서는 리플렉션을 사용하여 생성자가 매개변수를 전달해야 하는지 확인합니다. 1. 매개변수가 필요하지 않으면 직접 인스턴스화합니다. 2 매개변수가 전달되어야 하고 매개변수가 인스턴스화 가능한 클래스인 경우 이 클래스를 인스턴스화해 보세요(루프).
App::make
또는App::makeWith()
)의 로직에 추가하고 인스턴스화된 클래스를 매개변수정적 클래스는 직접 잊어버리세요. 매번 인스턴스화해야 한다는 사실을 나중에 알았습니다. 자동 인스턴스화가 컨트롤러에 주입되지만 다른 곳에서 호출하는 것은 수동으로 수행해야 하므로 모두 제가 정적으로 분류했습니다. . . . .
의존성 주입으로 해결할 수 없나요?