2011-02-26 4 views
1

구체적 I 동적 라우터 + dep.injection 패턴 같은 것을 사용에 일하고있어서 :동적 라우터 및 제어 메시지

  1. 라우터 객체 모듈 오브젝트를 인스턴스화하는 구성을 사용한다. 모듈은 독립적이며 많은 모듈 일 수 있습니다.
  2. 라우터 객체의 인스턴스가 모듈 생성자에 종속성이 주입되어 API 참조/포인터로 사용됩니다 (이 질문에 대해서는 별다른 의미가 없습니다.)
  3. 모듈은 API를 사용하여 링크 규칙을 추가합니다 특정 모듈 방식으로 입력 패턴
  4. 라우터 규칙 집합에 대해이를 확인 입력을 수신하고
  5. 결과가 라우터에 의해 수집하고, 출력 프로세서

모듈 생성자를 통해 전달되는 일치 모듈 메서드를 호출

  • :

    class module { 
        public function __construct(&$router) { 
         $router->addRoute('some-input-pattern', array($this, 'someMethod')); 
        } 
    
        public function someMethod() { 
         return 'some arbitrary result'; 
        } 
    } 
    

    간단하지만 이것은 모듈과 라우터가 임의의 반환 값과 관련이없는 것에 대해 통신해야하는 경우가 있습니다.

    예를 들어, 모듈이 모듈 자체에서 처리해야하는 이벤트 또는 예외를 트리거해야하는 경우가 있습니다. 모든 모듈 방법에서 시작될 수 있으며 특정 모듈 방법으로 처리해야합니다. (모든 메소드에서 try/catch 블록을 여러 개 가지고있는 것처럼 보이지 않으며, 예외를 처리 할 수있는 유일한 '진입 점'은 모듈 외부와 라우터에서 발생합니다. 모듈은 모듈 핸들을 처리하지만 라우터 만 수행 할 수 있습니다. 실제로 들립니다. 잘못된 소리입니다.)

    class module { 
        public function __construct(&$router) { 
         ... 
         $router->addExceptionHandler('dbTableNotFoundException', 
                array($this, 'installSchema')); 
        } 
    } 
    

    경우에 따라 라우터 자체에서 처리해야하는 이벤트가 있습니다. 예를 들어, 모듈은 라우터가 실제 입력을 무시하고 특별한 유형의 입력을받은 것처럼 진행하도록 요청할 수 있습니다. 그런 다음 라우터는 규칙 집합에 대해 라우터를 다시 확인하고 적절한 방법을 호출해야합니다. 이벤트는 인간의 눈 전용 오류로, 출력을 통해 전달보다 처리 다른 필요하지 않습니다 수있는 다른 경우에

    public function someMethod(){ 
         ... 
         throw routerRestartException('special-input'); 
        } 
    

    .

    public function someMethod(){ 
         ... 
         throw humanEyesException("You can't do that!"); 
        } 
    

    이 효과적으로 때문에 라우터와 모듈 교환 모두 임의의 반환 데이터 특수 제어 메시지, 두 통신 측면 생각 날 리드.

    지금까지 시스템 제어 메시지 측면은 예외를 던진 모듈과 라우터가 잡는 것으로 구현됩니다. 이를 위해서는 모듈이 두 가지 유형의 메소드를 등록해야합니다. 하나는 입력 처리를위한 메소드이고 다른 하나는 예외 처리를위한 메소드로, 이는 아마도 냄새가 심할 것입니다.

    일부 예외는 흐름 제어에 영향을주는 것으로 보이며, 예외를 사용하는 것도 좋은 습관은 아닙니다.

    라우터 개체와 해당 종속 모듈 간의 이러한 종류의 양방향 통신을 구축하는 데 가장 좋은 방법이나 패턴이 있습니까?들면

    public function __construct(&$router){ 
        ... 
        dbTableNotFoundException::addObserver(array($this, 'installSchema')); 
    } 
    
  • 답변

    0

    : 지정 예외 옵서버 패턴을 사용할 수있는 라우터에서 핸들링 모듈 예외를 분리하여 상황을 개선하는 하나 개의 방법 :

    EDIT

    A는 도중에 생각 다른 모듈 및 API 이벤트에 모듈 반응시키기 Observer 패턴을 사용합니다. 귀하의 API는 여러 관찰 가능한 주제를 제공 할 수 있습니다 (API는 유예/등록을 제공하고 각 관찰 대상에 대해 절차를 통지 할 수있는 클래스가 될 수 있음)