7.6. 플러그인
Zend Framework/7. Zend_Controller | 2007/04/11 23:50
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;
태그 : zend framework
trackback :: http://kkal3.net/trackback/86




