Php Yii:自定义错误处理转发
我正在寻找在我的Yii 1.1.14应用程序中转发错误处理的方法。情况如下: 假设我有两个模块:ClientModule at/client/,AdminModule at/admin/。如果url被解析为属于该模块中的任何控制器,则加载该控制器,并将errorHandler重新分配给模块级错误处理程序,如下所示:Php Yii:自定义错误处理转发,php,yii,error-handling,Php,Yii,Error Handling,我正在寻找在我的Yii 1.1.14应用程序中转发错误处理的方法。情况如下: 假设我有两个模块:ClientModule at/client/,AdminModule at/admin/。如果url被解析为属于该模块中的任何控制器,则加载该控制器,并将errorHandler重新分配给模块级错误处理程序,如下所示: public function beforeControllerAction($controller, $action) { Yii::app()->errorHand
public function beforeControllerAction($controller, $action)
{
Yii::app()->errorHandler->errorAction='admin/error';
return parent::beforeControllerAction($controller, $action);
}
通过这种方式,“admin/admin/error”中存在一个操作(该操作被手动指定为解析为“admin/error”),该操作将使用类似以下的样板文件处理错误:
public function actionError() {
if($error=Yii::app()->errorHandler->error)
{
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('application.views.error.index', $error);
}
}
同时,另一个模块中存在类似的代码(两个函数都有)(还有一个ClientModule和一个ClientController,其中一个actionError自动映射到“client/client/error”,重新映射到“client/error”)
我对这些代码块没有任何问题我的问题现在开始:
如果我输入了一个无法解析的url,即使前缀是模块前缀(例如“client/invalid/url”或“client/client/invalid”),也不会创建控制器(因为它不存在——或者,如第二个示例中所示,控制器存在但动作不存在),因此不会调用beforeController
,因此,将不会分配自定义错误处理程序(在本例中:对应于设置$aClientController->actionError的ClientModule)。结果:处理未解析url错误的默认ErrorController
所以,问题:
Yii::app()->errorHandler->error
状态)CController->forward('module/controller/action')
内部的ErrorController->actionError
方法,我可以到处调度。我还更改了另一个业务逻辑条件,不再在模块构造函数中分配自定义错误处理程序,但根据记录的用户类型,我仍然将这些控制器用作“错误/索引”的转发目标(即,发生了一个错误,用户是一个客户=>转发到客户机/客户机/错误,而作为管理员导致了管理员/管理员/错误,并且没有记录的用户像往常一样使用错误/索引执行错误处理)
public function actionIndex() {
if (Yii::app()->user->getState('client'))
{
$this->forward('client/client/error');
}
if (Yii::app()->user->getState('staff'))
{
$this->forward('admin/admin/error');
}
//usual boilerplate here
if($error=Yii::app()->errorHandler->error)
{
if(Yii::app()->request->isAjaxRequest)
echo $error['message'];
else
$this->render('index', $error);
}
}