установка макета действия ошибки в yii2 не работает

Для настройки действия при ошибке я добавил этот код в свой контроллер

public function beforeAction($action) {
    if ($action->id == 'error')
        $this->layout = 'iframe-main.php';

    $this->enableCsrfValidation = false;
    return parent::beforeAction($action);
}

Но это не работает. Макет ошибки отображается в макете по умолчанию.


person Jackhad    schedule 08.06.2016    source источник
comment
Аналогичный вопрос здесь: stackoverflow.com/questions/27573826/   -  person robsch    schedule 03.05.2017


Ответы (4)


Вы можете использовать официальный Yii2 yii\web\ErrorAction для обработки ошибок в контроллере:

/**
 * {@inheritdoc}
 */
public function actions()
{
    return [
        'error' => [
            'class' => 'yii\web\ErrorAction',
            'layout' => 'login',
        ],
    ];
}

Обратите внимание, что мы можем установить свойство layout для изменения макета для просмотра ошибок.

https://www.yiiframework.com/doc/api/2.0/yii-web-erroraction

person Nick Tsai    schedule 09.05.2018
comment
это должны быть принятые ответы, надежное решение с использованием свойств класса ErrorAction. Уважать - person pa3py6aka; 02.06.2019

Добавьте в свой конфиг:

'components' => ['errorHandler' => [
        'errorAction' => 'site/error',
    ],

Создайте контроллер, если он не существует: SiteController.php с содержимым:

namespace app\controllers;

use Yii;
use yii\web\Controller;

class SiteController extends Controller
{
    public function actionError()
    {
        $exception = Yii::$app->errorHandler->exception;
        if ($exception !== null) {
            $this->layout = 'yourNewLayout';
            return $this->render('error', ['exception' => $exception]);
        }
    }
}

И самый простой вид site/error.php:

<?php 
    use yii\helpers\Html; 
?>
<div class="site-error">
        <?= Html::encode($exception->getMessage()) ?>
</div>

Проверено на Yii2. Дополнительная информация в документации http://www.yiiframework.com/doc-2.0/guide-runtime-handling-errors.html#using-error-handler

person Yury    schedule 08.06.2016

Попробуй это:

public function beforeAction($action) {
    if (parent::beforeAction($action)) {
        // change layout for error action
        if ($action->id=='error') $this->layout ='iframe-main';
        return true;
    } else {
        return false;
    }
}
person jithin    schedule 08.06.2016
comment
ааа... это моя ошибка... Я добавляю это в свой контроллер вместо sitecontroller.php. Работает нормально! Спасибо!! :) - person Jackhad; 09.06.2016

В вашем actionError() SiteController просто добавьте имя макета по умолчанию

class SiteController extends Controller
{

public function actionError()
    {
        $this->layout='defaultLayoutName';
           //rest of the code goes here
    }
}
person vijay nathji    schedule 08.06.2016
comment
Я использую Yii2. Не будет actionError() - person Jackhad; 08.06.2016