Symfony为什么以及如何在prod环境中用空值填充未定义的视图变量


Why and how does Symfony fill undefined view variable with null values in prod environment?

考虑以下PHP模板:

<?= var_dump($myVariable) ?>

这是用以下控制器代码呈现的:

public function myAction() {
    return $this->render("MyBundle::test.html.php");
}

显然,我们的变量$myVariable没有在模板中设置。当在dev环境中查看此页面时,我们得到一个异常,告诉我们该变量未定义。在prod环境中查看页面时,我们得到输出null

我已经调试了这个相当多,但没有发现Symfony决定哪些变量需要用null初始化的地方。在幕后发生的事情是,Symfony在视图变量数组上调用export(在我们的例子中是空的),然后在视图模板本身上调用require。有趣的是,在调试视图时,变量从未在devprod中定义过。但是在这两种环境下仍然有不同的输出。

我的问题是:

  • Symfony如何做到这一点?
  • 这是预期的行为吗?
  • 这是记录在某处,我只是错过了它?
  • 是否有一种方法可以改变这种行为,以便它也会在prod中失败并将错误写入日志文件?

我才刚刚开始使用PHP和Symfony,但在我看来,它是这样的:

  1. Symfony将调用模板上的require
  2. 你的模板开始执行
  3. PHP试图计算$myVariable PHP将触发E_NOTICE级错误,如PHP手册所述

这就是不同环境发挥作用的地方。在debug.xml中的debug.error_handler.throw_at键下定义的错误级别是-1 (ALL) for dev和0 (NONE) for prod.所以对于dev, Symfony中的ErrorHandler将抛出,对于生产,它不会。