7.6.1. 소개

컨트롤러 구조는, 컨트롤러 처리 중에 어떤 이벤트가 발생할 때 사용자가 만든 코드를 호출할 수 있는, 플러그인 시스템을 포함하고 있습니다. 프론트 컨트롤러는, 플러그인 브로커에 사용자의 플러그인을 등록합니다. 그리고, 이벤트 메소드가 호출 되었을 때, 프론트 컨트롤러에 등록되어 있는 각 플러그인을 플러그인 브로커가 실행합니다.

이벤트 메소드는 추상 클래스 Zend_Controller_Plugin_Abstract로 정의되어 있습니다. 사용자 플러그인 클래스는 이것을 상속받습니다.

routeStartup()은 Zend_Controller_Front가 경로에 대한 요청(request)의 평가를 시작하기 전에 호출 됩니다.

routeShutdown()은 Zend_Controller_Front가 라우터로부터 빠져나올 때, Zend_Controller_Router가 종료한 후에 호출됩니다.

dispatchLoopStartup()은 Zend_Controller_Front가 디스패치 루프에 들어가기 전에 호출됩니다.

preDispatch()는 액션이 Zend_Controller_Dispatcher에 의해 디스패치 되기 전에 호출됩니다. 이 콜백은 프럭시나 필터 행동을 준비합니다. 요청(request)의 내용을 변경하고 디스패치 플래그를 리셋(Zend_Controller_Request_Abstract::setDispatched(false)를 사용합니다) 하는 것으로, 현재의 액션을 건너띄게 할 수 있습니다.

postDispatch()는 액션이 Zend_Controller_Dispatcher에 의해 디스패치 된 후에 호출됩니다. 이 콜백은 프럭시나 필터 행동을 준비합니다. 요청(request)의 내용을 변경하고 디스패치 플래그를 리셋(Zend_Controller_Request_Abstract::setDispatched(false)를 사용합니다), 새로운 액션을 디스패치 하도록 지정할 수 있습니다.

dispatchLoopShutdown()은 Zend_Controller_Front가 디스패치 루프를 종료하기 전에 호출됩니다.




7.6.2. 플러그인 쓰기

플러그인 클래스를 쓰려면, 단지 추상 클래스 Zend_Controller_Plugin_Abstract를 인클루드 해서 그것을 상속받으면 됩니다.


   <?php
   require_once 'Zend/Controller/Plugin/Abstract.php';

   class
MyPlugin extends Zend_Controller_Plugin_Abstract
   {
      
// ...
   }



Zend_Controller_Plugin_Abstract에는 추상 메소드는 없습니다. 즉, 위에 나타낸 이벤트 메소드를 플러그인 클래스에서 반드시 구현해야 하는 것은 아닙니다. 플러그인을 쓰는 사람이 필요한 것만을 선택해 구현할 수 있습니다.

또한, Zend_Controller_Plugin_Abstract는 getRequest() 메소드 및 getResponse() 메소드를 사용해서, 요청(request) 객체나 응답(response) 객체를 컨트롤러 플러그인에서 유용하게 사용할 수 있습니다.




7.6.3. 플러그인의 사용법

플러그인 클래스들은 디스패치 하기 전에 Zend_Controller_Front::registerPlugin()로 등록됩니다. 다음의 예는 컨트롤러 체인으로 플러그인을 사용하는 방법을 나타내는 것입니다.


   <?php
   require_once 'Zend/Controller/Front.php';
   require_once
'Zend/Controller/Router.php';
   require_once
'Zend/Controller/Plugin/Abstract.php';

   class
MyPlugin extends Zend_Controller_Plugin_Abstract
   {
       public function
routeStartup()
       {
          
$this->getResponse()->appendBody('<p>routeStartup() called</p>');
       }

       public function
routeShutdown($request)
       {
          
$this->getResponse()->appendBody('<p>routeShutdown() called</p>');
       }

       public function
dispatchLoopStartup($request)
       {
          
$this->getResponse()->appendBody('<p>dispatchLoopStartup() called</p>');
       }

       public function
preDispatch($request)
       {
          
$this->getResponse()->appendBody('<p>preDispatch() called</p>');
       }

       public function
postDispatch($request)
       {
          
$this->getResponse()->appendBody('<p>postDispatch() called</p>');
       }

       public function
dispatchLoopShutdown()
       {
          
$this->getResponse()->appendBody('<p>dispatchLoopShutdown() called</p>');
       }
   }

   $controller = Zend_Controller_Front::getInstance();
   $controller->setControllerDirectory('/path/to/controllers')
                 ->
setRouter(new Zend_Controller_Router())
                 ->
registerPlugin(new MyPlugin());
   $response = $controller->dispatch();

   echo
$response;






크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2007/04/11 23:50 2007/04/11 23:50
trackback :: http://kkal3.net/trackback/86
[로그인][오픈아이디란?]
 이전  12345678 ... 49   다음