Yii2:如何自定义错误页面,如404和503

112*_*ion 2 php yii2

我有以下errorHandler的配置

'errorHandler' => [
    'errorAction' => 'page/error',
],
Run Code Online (Sandbox Code Playgroud)

在“控制器”页面中,在要检查的“操作”错误中,出现了404错误“找不到页面”?

我该如何检查?

Muh*_*lam 6

如果你想自定义Error page,并希望单独获取视图内的错误代码,那么你拥有的$exception$name$message可用的视图中的变量,但在情况下,如果你用yii\web\ErrorAction,我先走之前,你需要了解哪一类你倒下。

案例1使用 \yii\web\ErrorAction

  1. 在您的内部,您PageController应该具有以下actions()功能。

    public function actions() {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction' ,
            ] 
        ];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您尚未为错误创建单独的布局,请立即添加一个布局,最好将您的错误布局保持独立。只需复制layouts/main.php并删除所有多余的CSS和js文件,或者frontend/assets/ErrorAsset.php在布局文件顶部创建并注册。

  3. beforeAction()PageController下方添加您喜欢的功能。

    样例代码

    public function beforeAction( $action ) {
        if ( parent::beforeAction ( $action ) ) {
    
             //change layout for error action after 
             //checking for the error action name 
             //so that the layout is set for errors only
            if ( $action->id == 'error' ) {
                $this->layout = 'error';
            }
            return true;
        } 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,您已经'page/error'errorHandler组件的内部配置中指定了名称error,因此操作名称也应该是视图文件,该名称也应该是视图文件,该视图文件应位于page文件夹内,该文件夹应为path page/error.php。您拥有$exception可用的变量,该变量在您的案例yii\web\NotFoundHttpException对象中保存异常对象。然后您可以致电$exception->statusCode查看已为该异常抛出了哪个状态代码,在您的情况下,该代码将显示为404


案例2:使用自定义操作显示错误

另一种方法是在控制器内部使用自定义操作,而不是使用,yii\web\ErrorAction在这种情况下,您无需添加actions()函数,而应在自定义错误函数内部调用

$exception  =   Yii::$app->getErrorHandler()->exception; 
Run Code Online (Sandbox Code Playgroud)

并使用$exception->statusCode。确保检查beforeAction()函数内部的确切动作名称,并相应地更改该行的检查

if ( $action->id == 'error' ) {
Run Code Online (Sandbox Code Playgroud)

案例3关机只是给我例外

如果您不需要上面的任何内容,而只想检查控制器内部的Exception代码,则beforeAction()必须exception通过配置的erorHandler组件以快捷方式访问上面的相同对象。

public function beforeAction($action) {

    $exception = Yii::$app->getErrorHandler()->exception;

    if(parent::beforeAction($action)) {
        $hasError = $action->id == 'error' && $exception !== NULL;

        if($hasError) {
            echo $exception->statusCode;
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)