Cakephp 如何为错误页面使用自定义主题?

Cakephp 如何为错误页面使用自定义主题?,cakephp,error-handling,themes,cakephp-3.2,Cakephp,Error Handling,Themes,Cakephp 3.2,我正在开发一个应用程序,它在布局中使用主题,我还需要在所有错误页面中使用自定义主题 通过查看,我发现通过使用 $this->layout = 'mylayout'; 在错误页面本身,但我也需要更改主题。我试过了 $this->theme = 'mytheme'; 但是错误页面仍然使用默认主题,所以我想这不是正确的设置方式 为错误页面设置主题的正确方法是什么?最容易通过控制器进行设置。在PreRender事件之前,或者对于早期的CakePHP版本,通过控制器::$theme属性进行

我正在开发一个应用程序,它在布局中使用主题,我还需要在所有错误页面中使用自定义主题

通过查看,我发现通过使用

$this->layout = 'mylayout';
在错误页面本身,但我也需要更改主题。我试过了

$this->theme = 'mytheme';
但是错误页面仍然使用默认主题,所以我想这不是正确的设置方式

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

最容易通过
控制器进行设置。在PreRender
事件之前,或者对于早期的CakePHP版本,通过
控制器::$theme
属性进行设置

默认异常呈现程序使用新的控制器实例来处理错误,因此您可以

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

src/Controller/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');
    }
}
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;
    }
}
// ...
'Error' => [
    'exceptionRenderer' => '\App\Error\AppExceptionRenderer',
    // ...
],
// ...
完成后,所有异常现在都应该使用
ErrorThemeName
主题

另见

创建自定义异常呈现程序并向控制器添加侦听器 您还可以创建自定义/扩展异常渲染器,并覆盖
异常渲染器::\u getController()
,并为
控制器添加一个适当的侦听器。beforeRender
可以在其中设置主题

src/Error/AppExceptionRenderer.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');
    }
}
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;
    }
}
// ...
'Error' => [
    'exceptionRenderer' => '\App\Error\AppExceptionRenderer',
    // ...
],
// ...
config/app.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');
    }
}
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;
    }
}
// ...
'Error' => [
    'exceptionRenderer' => '\App\Error\AppExceptionRenderer',
    // ...
],
// ...
另见


ndm,你是最棒的!它工作得很好。我试图通过
AppController
执行相同的操作,但它不起作用。。。非常感谢。我认为,
ErrorController
应该放在文档中,这对我这种情况的人来说是一个简单而有用的提示。。。