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

标签 cakephp error-handling themes cakephp-3.2

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

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

$this->layout = 'mylayout';

在错误页面本身中,但是我也需要更改主题。我尝试过
$this->theme = 'mytheme';

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

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

最佳答案

Themes最容易通过Controller.beforeRender事件设置,对于更早的CakePHP版本,则可以通过Controller::$theme属性设置。

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

创建一个自定义错误 Controller 并添加一个侦听器/回调

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

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');
    }
}

完成后,所有异常现在都应使用ErrorThemeName主题。

也可以看看
  • Cookbook > Error & Exception Handling > Creating a Custom Controller to Handle Exceptions

  • 创建一个自定义异常渲染器并将侦听器添加到 Controller

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

    src/Error/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;
        }
    }
    

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

    也可以看看

    Cookbook > Error & Exception Handling > Using the exceptionRenderer Option of the Default Handler

    关于cakephp - 如何为错误页面使用自定义主题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38921925/

    相关文章:

    php - CakePHP:访问 database.php 值

    php - 使用 CakePHP 运行一个 sql server 存储过程

    java - 您需要将主题与设计库一起使用

    java - 如何将主题应用到首选项屏幕

    cakephp - 蛋糕 php 计数不同

    php - 定期更新和修改数据库中的数据php

    json - 在 ASP .NET MVC3 上使用 HTML 而不是 JSON 的 IIS 响应

    python - 四处走走 "ValueError: operands could not be broadcast together"

    c# - Process.Kill非静态字段错误

    themes - 如何更改 Aptana 终端主题?