2013-07-11 3 views
0

방금 ​​http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1 개의 기사를 읽고 DI 컨테이너에 대해 몇 가지 질문이 있습니다. DI 컨테이너 및 컨트롤러

의 내가 내 컨트롤러 내부 이벤트를 발생하고 싶은 말은하자

, 어떻게 내가 내 컨트롤러 내부의 디스패처를 얻을 것? '응용 프로그램은'심포니 \ HttpKernel입니다

나는

$c->get('app')->handle($request); 

를 통해 내 테스트 프레임 워크를 시작 해요. 컨테이너에 의존성을 어떻게 설정할 수 있습니까? 의 내가 용기

$c->register('view.engine', 'Core\ViewEngine'); 

에 정의 된 뷰 엔진을 가지고 있고 그 객체를 제공, 또는 뷰를 렌더링하는 내 컨트롤러 내에서 해당 개체를 해결하기를 원하는 경우를 생각 해보자. 그것은 이벤트 화재와 같은 문제입니다, 내 컨트롤러 내부의 값에 액세스 할 수 없습니다 ... DI 컨테이너는 어떻게 이런 상황에서 작동해야합니까?

감사합니다.

답변

-1

다른 접근 방식이 있습니다. silex 문서를 통해 다음 단계로 읽을 수 있습니다. silex에서 응용 프로그램 자체는 DI 컨테이너입니다. Symfony 2 문서 소개를 읽어 볼 수도 있습니다.

가장 똑바로 앞으로 접근 (그리고 기본적으로 S2에서 사용하는)는 컨트롤러에 DI 컨테이너 자체를 주입하는 것입니다. 그런 다음 컨트롤러는 필요한 경우 디스패처와 같은 서비스를 가져올 수 있습니다.

A "더 나은"접근 방식은 컨트롤러는 컨트롤러에 직접 필요로 어떤 다른 사람과 함께 디스패처를 주입하는 것입니다. 컨트롤러 자체가 컨테이너에 액세스 할 필요가 없으므로 "더 나은"방법입니다. 그러나 컨트롤러가 종종 업무에 필요한 많은 서비스를 필요로하기 때문에 더 어려워집니다.

==============================================

어떻게 생각 컨트롤러 컨테이너를 주입 것 ? 기존의 프레임 워크에서 찾고있다

은 편리하기 시작합니다. HTTPKernel은 프레임 워크가 아닌 구성 요소임을 기억하십시오. 어떻게 사용하는지는 당신에게 달려 있습니다.

Symfony 2에서 app 객체는 실제로 HTTP 커널이 아니라 Kernel에서 파생됩니다. 커널은 차례로 컨테이너의 인스턴스뿐만 아니라 HTTPKernel의 인스턴스를 포함합니다.

몇 가지 접근법이 있습니다. 하나의 "올바른"것은 없습니다.

당신이 HTTPKernel로 보면 :: 당신이 찾을 수 handleRaw :

$controller = $this->resolver->getController($request)) 

컨트롤러를 만든 후 컨테이너를 주입하는 것이 자신의 컨트롤러 확인자 개체를 만들 수 있습니다. 한 가지 가능성.

+0

컨트롤러에 컨테이너를 삽입하는 방법은 무엇입니까? HttpKernel은 컨트롤러를 생성하고 있기 때문에 생성자를 통해 넘겨 줄 수는 없으며 컨트롤러를 제어 할 수도 없습니다. 응답 객체는 모두 응답 객체 – user2538584

+0

입니다. 실제로 2 년 뒤에 작동합니다. 용감 했어. – Cerad

관련 문제