Buenas, al final lo he solucionado de otra forma, no se si será buena, pero al menos funciona y controla lo que esperaba.
Probé con el ejemplo que viene en el manual de Zend,
control de excepciones, pero me daba error el ejemplo que tienen. (Lo pongo mas abajo por si alguien le sirve o quiere probarlo)
Entonces, encontré
esta función en stackoverflow, que con un par de ajustes se adapta a lo que buscaba.
Con la función $this->_actionExists, comprueba en el array que existen los modulos, controllers y actions que se piden.
En función de si retorna true o false, despacha el error, continua con el acl, o añade el nuevo recurso a la db para gestionar después los permisos.
Código PHP:
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
// else show the error
$this->_mca = false;
if( $frontController->getDispatcher()->isDispatchable($request) &&
$this->_actionExists($module, $controller, $action) )
{
// if dispatchable do some stuff
$this->_mca = true;
}
}
Código del Manual Zend
Código PHP:
class My_Controller_PreDispatchPlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
$dispatcher = $front->getDispatcher();
$class = $dispatcher->getControllerClass($request);
if (!$controller) {
$class = $dispatcher->getDefaultControllerClass($request);
}
$r = new ReflectionClass($class);
$action = $dispatcher->getActionMethod($request);
if (!$r->hasMethod($action)) {
$defaultAction = $dispatcher->getDefaultAction();
$controllerName = $request->getControllerName();
$response = $front->getResponse();
$response->setRedirect('/' . $controllerName
. '/' . $defaultAction);
$response->sendHeaders();
exit;
}
}
}
Saludos,