我有一个扩展了
我想在这个插件中抛出一个异常,比如
问题是,在插件中抛出异常并不能阻止原始操作的执行。因此,我最终会得到原始操作的输出和
如何使插件中抛出的异常能够停止原始操作的执行? 案例1
Zend_Controller_Plugin_Abstract
的Acl插件,它处理了我所有的Acl代码。我想在这个插件中抛出一个异常,比如
Exception_Unauthorised
,然后在我的ErrorController
中处理它,这样我可以为不同的应用程序使用相同的Acl插件,并在每个应用程序中使用ErrorController
以不同的方式处理每种情况-如果需要的话。问题是,在插件中抛出异常并不能阻止原始操作的执行。因此,我最终会得到原始操作的输出和
ErrorController
的输出。如何使插件中抛出的异常能够停止原始操作的执行? 案例1
// This throws the `Exception_NoPermissions`, but it does not get caught by
// `ErrorController`
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
parent::preDispatch($request);
throw new Exception_NoPermissions("incorrect permissions");
}
案例2
// This behaves as expected and allows me to catch my Exception
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
parent::preDispatch($request);
try
{
throw new Exception_NoPermissions("incorrect permissions");
}
catch(Exception_NoPermissions $e)
{
}
}
案例三
我认为问题就出在这里,通过更改控制器解决。
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
parent::preDispatch($request);
// Attempt to log in the user
// Check user against ACL
if(!$loggedIn || !$access)
{
// set controller to login, doing this displays the ErrorController output and
// the login controller
$request->getControllerName("login");
}
}