2016-07-25 5 views
0

Inversion of Control 컨테이너가 작동하는 방법을 알고 있고 자신을 만드는 방법을 알고 있습니다. 그러나 나는 레지스터와 메소드를 이용하여이를 수행하는 방법을 알고 있습니다.laravel은 type 힌팅을 기반으로 종속성을 어떻게 해결합니까?

나는 Laravel 문서를 살펴 봤지만 Laravel이 typehinting을 기반으로 종속성을 해결할 수있는 방법을 알아 내려고 노력하고 있습니다. 이 정확한 부분에 대한 누락 된 링크는 어디에 있습니까?

내가 수동으로 물건을 해결하는보다 전통적인 IoC 컨테이너를 사용할 때, 나는 적어도 정적 방법을 호출해야한다. Laravel은 이것을 필요로하지 않습니다.

누군가 올바른 방향으로 나를 조종하거나 작은 예를 설정할 수 있습니까? 정리 해보으로

http://code.tutsplus.com/tutorials/dependency-injection-huh--net-26903

:

나는 통해 내 방식대로 일했다. 아마 누군가는 타입 힌팅을위한 자동 해상도를 가진 빠른 예를 만들 수 있었 을까 아니면 정말로 복잡한 것일까?

+1

질문에 따라 Laravel이 형식 힌트를 통해 DI를 해결하는 방법을 알고 싶습니다. 당신이 찾고있는 것은 Reflection in PHP입니다. 리플렉션을 사용하면 변수 안에 클래스의 미러 객체를 만들고 인스턴스를 만들기 전에 탐색 할 수 있습니다. –

+0

비록 형식 힌트가 사용될 때마다 reflectionclass가 어떻게 발생합니까? –

+1

그렇지 않습니다. laravel에주의를 기울이면 Laravel이 호출하는 클래스/메소드에 대한 DI 만 있습니다. 수동으로 개체를 배치하면 DI가 저장하지 않는다는 것을 알 수 있습니다. –

답변

3

마법은 Laravel의 Container.php 클래스에서 일어나며, 종속성은 리플렉션을 사용하여 자동으로 해결됩니다.

Laravel의 DI 컨테이너를 사용하여 인스턴스화되거나 "만들어진"클래스 만이 종속성 삽입 기능의 이점을 누릴 수 있습니다.

+0

나는 모든 컨트롤러가 단순히 URL과 컨트롤러 이름을받는 라우터를 기반으로 인스턴스화되고 있다고 생각합니다. 이 부분은 어디에서 발생합니까? 컨트롤러 인스턴스에 대한 실제로 "새로운"문. 어떤 지점에서 콘트롤러가 콘테이너와 연결되어 콘테이너로부터의 반사를 사용할 수 있습니까? –

+0

이 모든 것은'build()'메소드에서 발생합니다. Laravel의 DI 컨테이너에 의해 빌드 된 모든 클래스는이 메서드 내부에 생성됩니다. 이 방법에는 2 개의 반환 지점이 있습니다. 첫 번째 것은 [line 761] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L761)이며, 여기서 인스턴스화 된 객체는 new 키워드를 사용하여 생성됩니다. if 클래스에는'__construct()'메소드가 정의되어 있지 않습니다. 두 번째 반환 지점은 [779] (https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L779)이며 여기서 클래스는 인수로 인스턴스화됩니다. –

관련 문제