1

我正在开发一个使用主题进行布局的应用程序,并且我也需要为所有错误页面使用自定义主题。

查看文档,我发现我可以通过使用相当轻松地更改布局

$this->layout = 'mylayout';

在错误页面本身,但我也需要更改主题。我试过了

$this->theme = 'mytheme';

但是错误页面仍然使用默认主题,所以我猜这不是正确的设置方式。

为错误页面设置主题的正确方法是什么?

4

1 回答 1

3

主题最容易通过Controller.beforeRender事件设置,对于早期的 CakePHP 版本,通过Controller::$theme属性设置。

默认的异常渲染器使用一个新的控制器实例来处理错误,因此您可以例如

创建自定义错误控制器并添加侦听器/回调

一种选择是创建一个自定义错误控制器,您可以在其中设置主题,就像在常规控制器中一样。默认情况下\App\Controller\ErrorController,如果存在 CakePHP 将使用它,因此您需要做的就是创建控制器。

src/控制器/ErrorController.php

namespace App\Controller;

use Cake\Controller\Controller;
use Cake\Event\Event;

class ErrorController extends Controller
{
    public function beforeRender(Event $event)
    {
        $this->viewBuilder()->theme('ErrorThemeName');
    }
}

完成,所有例外现在都应该使用ErrorThemeName主题。

也可以看看

创建自定义异常渲染器并向控制器添加监听器

您还可以创建自定义/扩展异常渲染器,并覆盖,并为您可以设置主题ExceptionRenderer::_getController()的位置添加适当的侦听器。Controller.beforeRender

src/错误/AppExceptionRenderer.php

namespace App\Error;

use Cake\Error\ExceptionRenderer;
use Cake\Event\Event;

class AppExceptionRenderer extends ExceptionRenderer
{
    protected function _getController()
    {
        $controller = parent::_getController();
        $controller->eventManager()->on('Controller.beforeRender', function (Event $event) {
            $event->subject()->viewBuilder()->theme('ErrorThemeName');
        });
        return $controller;
    }
}

配置/app.php

// ...
'Error' => [
    'exceptionRenderer' => '\App\Error\AppExceptionRenderer',
    // ...
],
// ...

也可以看看

Cookbook > 错误和异常处理 > 使用默认处理程序的 exceptionRenderer 选项

于 2016-08-12T16:45:56.267 回答