2012-01-04 5 views
0

yadif의 수정 된 복사본을 내 종속성 주입 프레임 워크로 사용하고 있습니다.종속성 컨테이너 주입을위한 클래스 표시

abstract class AContainerAware{ 
    protected $_container; 

    public function setContainer(Container $container){ 
     $this->_container = $container; 
    } 

    protected function get($component){ 
     //return a component from $this->_container; 
    } 
} 

이 대부분의 경우에서 잘 작동 :

현재, 나는 symfony2의 ContainerAware에 비슷한입니다 AContainerAware라는 추상 클래스를 만들었습니다. 컨테이너에 AContainerAware를 확장해야하는 클래스가 있고 컨테이너는 setContainer()을 사용하여 개체를 만드는 동안 DI 프레임 워크에서 자동으로 주입됩니다. 그런 다음 컨테이너에서 구성 요소를 쉽게 가져올 수 있습니다.

타사 공급 업체 패키지로 작업 할 때 문제가 있습니다. 이 경우, 예를 들어 twig의 확장 프로그램을 작성하려면 Twig_Extension 클래스를 확장해야하는데 이는 컨테이너에 액세스하기 위해 AContainerAware을 확장 할 수 없음을 의미합니다.

AContainerAware을 인터페이스 IContainerAware으로 바꿀 것인지 고려 중입니다. 클래스는 여러 인터페이스를 구현할 수 있으므로 대부분의 경우 IContainerAware을 구현할 수 있어야합니다. 이 접근법의 유일한 문제점은 인터페이스에 setContainer()get()에 대한 코드를 작성할 수 없으므로 컨테이너가 필요한 각 클래스에서 해당 함수의 정확한 코드를 구현해야한다는 것은 반복적 인 문제입니다. 또한 setContainer()get()이 앞으로 변경 될 경우 유지 관리 문제가 발생합니다.

컨테이너 주입을위한 클래스를 표시하는 더 좋은 방법이 있습니까?

+0

다음과 같이 여러 클래스를 확장 할 수 있습니다. http://stackoverflow.com/questions/356128/can-i-extend-a-class-using-more-than-1-class-in-php – Rijk

+0

' 그래도'__call()'을 사용하여 다중 상속을 위장하는 것을 좋아하지는 않는다. 또한 클래스 중 하나의 복사본을 클래스 내에서 인스턴스화해야합니다. 이러한 종류의 종속성 주입은 패배합니다. – F21

답변

-1

PHP 5.4에서 소개 된 PHP traits을 사용할 수 있습니다.

특성은 코드의 수평 재사용을 허용하지만 상속은 수직 재사용입니다. 클래스는 여러 특성을 사용할 수 있지만 한 부모 클래스 만 상속 할 수 있습니다.

관련 문제