如何为错误页面使用自定义主题?
How to use a custom theme for error pages?
我正在开发一个使用主题布局的应用程序,我也需要为所有错误页面使用自定义主题。
查看 the docs,我发现使用
可以很容易地更改布局
$this->layout = 'mylayout';
在错误页面本身,但我也需要更改主题。我试过
$this->theme = 'mytheme';
但是错误页面仍然使用默认主题,所以我想这不是正确的设置方式。
为错误页面设置主题的正确方法是什么?
Themes 最容易通过 Controller.beforeRender
事件设置,或者对于早期的 CakePHP 版本,通过 Controller::$theme
属性.
默认异常渲染器使用新的控制器实例来处理错误,因此您可以例如
创建自定义错误控制器并添加 listener/callback
一个选项是创建一个自定义错误控制器,您可以在其中像在常规控制器中一样设置主题。默认情况下,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');
}
}
完成,所有异常现在都应使用 ErrorThemeName
主题。
另见
创建自定义异常渲染器并向控制器添加侦听器
您还可以创建一个 custom/extended 异常渲染器,覆盖 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
我正在开发一个使用主题布局的应用程序,我也需要为所有错误页面使用自定义主题。
查看 the docs,我发现使用
可以很容易地更改布局$this->layout = 'mylayout';
在错误页面本身,但我也需要更改主题。我试过
$this->theme = 'mytheme';
但是错误页面仍然使用默认主题,所以我想这不是正确的设置方式。
为错误页面设置主题的正确方法是什么?
Themes 最容易通过 Controller.beforeRender
事件设置,或者对于早期的 CakePHP 版本,通过 Controller::$theme
属性.
默认异常渲染器使用新的控制器实例来处理错误,因此您可以例如
创建自定义错误控制器并添加 listener/callback
一个选项是创建一个自定义错误控制器,您可以在其中像在常规控制器中一样设置主题。默认情况下,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');
}
}
完成,所有异常现在都应使用 ErrorThemeName
主题。
另见
创建自定义异常渲染器并向控制器添加侦听器
您还可以创建一个 custom/extended 异常渲染器,覆盖 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