-- Ralf Kramer <[EMAIL PROTECTED]> wrote
(on Thursday, 13 September 2007, 02:11 AM +0200):
> I'd like to develop a module based application and want to assign an own
> ErrorHandler class for each module. So I have a structure like this:
> 
> /public
>  /controllers
>    IndexController.php
>    ErrorController.php
> /admin
>  /controllers
>    IndexController.php
>    ErrorController.php
> /user
>  /controllers
>    IndexController.php
>    ErrorController.php
> 
> The entire Applciation uses one very simple bootstrap:
> $frontController = Zend_Controller_Front::getInstance();
> $frontController->setControllerDirectory(array(
>     ''          => '../application/public/controllers/',
>     'admin'     => '../application/admin/controllers/',
>     'user'      => '../application/user/controllers/'
> ));
> $frontController->returnResponse(true);
> $response = $frontController->dispatch();
> $response->sendResponse(); 
> 
> 
> I know that I can change the default forward to
> ErrorController::errorAction() by calling
> Zend_Controller_Plugin_ErrorHandler::setErrorHandlerModule()
> but this alone wont help. How can I assign the ErrorHandler dynamically
> accordingly to the currently routed module? What is best practice in
> this case. Any help and hints are welcome.

First off, you can grab the error handler plugin from the front
controller, and modify it once retrieved:

    $errorHandler = Zend_Controller_Front::getInstance()
                ->getPlugin('Zend_Controller_Plugin_ErrorHandler');
    $errorHandler->setErrorHandlerModule(...);

If you want to have it dynamically change per-action, the easiest way
would be to create a plugin that runs a preDispatch(); it would look
something like this:

    class OverrideErrorModule extends Zend_Controller_Plugin_Abstract
    {
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
            $module = $request->getModuleName();
            $errorHandler = Zend_Controller_Front::getInstance()
                        ->getPlugin('Zend_Controller_Plugin_ErrorHandler');
            $errorHandler->setErrorHandlerModule($module));
        }
    }

and then make sure to register this in your bootstrap:

    $front->registerPlugin(new OverrideErrorModule());

-- 
Matthew Weier O'Phinney
PHP Developer            | [EMAIL PROTECTED]
Zend - The PHP Company   | http://www.zend.com/

Reply via email to