CakePHP的3 - VAR不会传输到查看时抛出异常(Cakephp 3 - var not

2019-10-23 03:19发布

在我AppController中,我定义了必须在每个视图(包括error400.ctp,error500.ctp)我的应用程序中使用的变量:

// /src/Controller/AppController.php
public function beforeFilter(Event $event)
{
    parent::beforeFilter($event);
    $foo = 'bar';
    $this->set(compact('foo'));
}

它运作良好,当抛出一个异常(如NotFoundException)不同的是:我收到以下错误:

Undefined variable: foo in /src/Template/Error/error400.ctp

这是CakePHP中的正常行为? 我怎么能解决这个问题?

Answer 1:

是的,这是正常的行为,什么是基本发生的事情:

  1. 异常被抛出( beforeFilter取决于它被扔在那里叫,例如,它被调用MissingAction或MissingTemplate,而不是MissingController)。

  2. 请求处理被中止, ErrorHandler的步骤,以捕获并处理这个异常。

  3. 要渲染的异常, ErroHandler使用ExceptionRenderer ,这反过来又创造特殊ErrorController ,那种取代原来的控制器。 这也意味着,现在你有完全不同的控制器处理请求(Controller类的新实例),所以即使beforeFilter被称为和$foo设置,它是不是不再有效。

  4. ExceptionRenderer将使用自己的render()方法来创建错误页面的输出。

要自定义这一点,你可以扩展默认ExceptionRenderer ,这样你就能变量设置为ErrorController

<?php
// goes in src/Error/AppExceptionRenderer
namespace App\Error;

use Cake\Error\ExceptionRenderer;

class AppExceptionRenderer extends ExceptionRenderer
{
    public function render()
    {
        $this->controller->set('foo', 'bar');
        return parent::render();
    }
}

设置这个类作为默认ExceptionRenderer在app.php

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

所以,你需要设置全局视图变量在两个地方。 从模型使用一些常用的方法, Configure类读取全局变量或什么是适合你的要求。

更多关于自定义错误处理: 扩展和实现自己的异常处理程序



文章来源: Cakephp 3 - var not transmitted to view when exception thrown