Php Yii:自定义错误处理转发

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

我正在寻找在我的Yii 1.1.14应用程序中转发错误处理的方法。情况如下:

假设我有两个模块:ClientModule at/client/,AdminModule at/admin/。如果url被解析为属于该模块中的任何控制器,则加载该控制器,并将errorHandler重新分配给模块级错误处理程序,如下所示:

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

所以,问题

  • 根据前缀,有没有办法将未解析的url(404)错误映射到某个模块?(在我的例子中,假设前缀是安全的,因为我没有将任何模块设置为默认值)

  • 或者:在ErrorController->actionIndex()中,是否有方法将错误处理转发给其中一个控制器(即移动到admin/admin/error和client/client/error,同时保持
    Yii::app()->errorHandler->error
    状态)

  • 编辑-脚注:如果错误处理代码相同,为什么要使用其他控制器?因为我有在布局中使用的那些控制器提供的附加数据(例如,菜单、标题菜单)。

    再次找到了答案(我的年轻度没有限制-,我需要的方法名称有确切的名称:forward!!

    使用
    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);
        }
    }