이제 회사의 비즈니스는 비즈니스 처리의 일부에 대한 컨트롤러를 대체하기 위해 C 계층 기반의 서비스 계층을 추가해야 합니다.
그래서 앱 디렉터리에 새 Services 폴더를 만든 다음 c를 호출했습니다. 레이어 컨트롤러:
$services = App::make('호출할 서비스의 전체 클래스 이름');
services 폴더에 지정된 클래스를 얻을 수는 있지만 이 클래스의 생성자에 매개변수가 필요한 경우 전혀 전달할 수 없습니다.
다음과 같이 작성해 보았습니다.
컨트롤러 레이어:
app/services 디렉토리의 Servicetest.php에 다음을 작성하세요.
으아아아인스턴스화된 객체 $services가 make 메소드를 통해 획득될 때 해당 __construct() 생성자가 트리거되지 않고 $a, $b 및 111이 출력되지 않지만 $services->test()라는 것이 매우 이상합니다. 성공적으로 실행되어 '성공'이 출력되었습니다.
그렇다면 컨트롤러의 서비스 폴더에 있는 클래스를 도입하고 실행하여 로드를 공유할 것인지 알려주실 수 있나요? 비즈니스 로직의 일부 구현을 어떻게 도입합니까? App::make() 메서드는 매우 훌륭하다고 생각합니다. 수동 요구가 필요하지 않고 인스턴스화된 개체를 직접 가져오는데 왜 인스턴스화되지 않습니까? 생성자 출력 111을 실행하면 C 계층의 App::make()를 통해 서비스 계층의 생성자에 매개변수를 어떻게 전달할 수 있나요?
도움을 기대합니다. 모두 감사합니다.
당신이 어떻게 성공했는지는 모르겠지만 적어도 당신의 접근 방식을 따라 로컬에서 테스트했지만 실패했습니다(제 Laravel은 버전 5.4입니다).
App::make('className')
관련 코드도 살펴봤습니다. 우선 이 메소드는 생성자 메소드에 매개변수 전달을 지원하지 않습니다.App::make('className')
相关的代码, 首先该方法不支持为构造方法传参数。如果需要向构造方法传参数,请使用
App::makeWith('className', [param1, param2, ...])
。其代码实现是利用反射,检查构造函数是否需要传参数:
1. 매개변수가 필요하지 않으면 직접 인스턴스화합니다. 2 매개변수가 전달되어야 하고 매개변수가 인스턴스화 가능한 클래스인 경우 이 클래스를 인스턴스화해 보세요(루프).
3으로 전달합니다. 필요한 경우 매개변수가 전달되는 경우, 매개변수가 인스턴스화할 수 없는 매개변수(예: 유형 힌트가 없는 변수, 유형 힌트가 정수, 문자열, 부동 소수점 등)인 경우 기본 매개변수가 있는지 추가로 확인하고, 기본 매개변수가 있는 경우 기본 매개변수를 전달합니다. 생성자로 이동합니다. 기본 매개변수가 없으면 아래와 같이 예외가 발생합니다. 🎜🎜🎜🎜🎜1,如果不需要传参数,则直接实例化
2,如果需要传参数,且参数为可实例化的类,则尝试实例化该类(循环进入
App::make
或App::makeWith()
생성자에 매개변수를 전달해야 하는 경우
App::makeWith('className', [param1, param2, ...])
를 사용하세요.코드 구현에서는 리플렉션을 사용하여 생성자가 매개변수를 전달해야 하는지 확인합니다.
App::make
또는App::makeWith()
)의 로직에 추가하고 인스턴스화된 클래스를 매개변수정적 클래스는 직접 잊어버리세요. 매번 인스턴스화해야 한다는 사실을 나중에 알았습니다. 자동 인스턴스화가 컨트롤러에 주입되지만 다른 곳에서 호출하는 것은 수동으로 수행해야 하므로 모두 제가 정적으로 분류했습니다. . . . .
의존성 주입으로 해결할 수 없나요?