曾经四处张望,但找不到解决问题的方法。 我制作了一个自定义的PHP MVC(使用来自各种来源的帮助),使用了Twig的模板引擎,并且渲染效果很好。我添加了一个自定义错误处理程序,它也可以正常工作。 我设置了一个常量以在dev中显示错误,但在prod中只需记录它们并呈现自定义404和500视图。当为该特定选项调用树枝渲染($ template)函数时,它仅返回以下错误:
Fatal error: Uncaught TypeError: Argument 1 passed to Twig\Environment::getTemplateClass() must be of the type string, null given, called in
C:\Users\duboi\OneDrive\Documents\Programming\www\fabrice\vendor\twig\twig\src\Template.php on line 321 and defined in
C:\Users\duboi\OneDrive\Documents\Programming\www\fabrice\vendor\twig\twig\src\Environment.php on line 259
当未触发404和500个HTTP请求时,没有任何问题。 (现有路线/控制器/动作)
我从列出的错误中查看了Twig的类,发现引起问题的参数是public function \Twig\Environment::getTemplateClass($name, int $index = null): string
中的$ name
我跟踪了函数调用,并在变量中的每个变量中都做了一个var_dump(),该变量最终是$ name参数。全部显示\vendor\twig\twig\src\Environment.php:279:string '404.html' (length=8)
,它是一个字符串,并且不是NULL。错误为何如此说明?
Error.php:
public static function exceptionHandler($exception) {
$code = $exception->getCode();
if ($code != 404) {
$code = 500;
}
http_response_code($code);
if (\App\Config::SHOW_ERRORS) {
[....]
} else {
$log = ROOT . DS . 'logs' . DS . date('Y-m-d') . '.txt';
ini_set('error_log', $log);
$message = "Uncaught Exception: '" . get_class($exception) . "'";
$message .= " with message '" . $exception->getMessage() . "'";
$message .= "\nStack trace: " . $exception->getTraceAsString();
$message .= "\nThrown in '" . $exception->getFile() . "' on line " . $exception->getLine();
error_log($message);
View::renderTemplate($code . '.html');
}
}
View.php:
public static function renderTemplate($template, $args = []) {
static $twig = null;
if ($twig === null) {
$loader = new \Twig\Loader\FilesystemLoader(ROOT . DS . 'App' . DS . 'Views');
$twig = new \Twig\Environment($loader);
}
echo $twig->render($template, $args); // this is the point of my code when the error occurs
}
答案 0 :(得分:0)
我有完全相同的错误消息。对我来说,问题是,我忘了将baseTemplate
放在引号中,而这是我在要呈现的模板中扩展的。
(我有{% extends firstTwigBaseTemplate.html %}
代替
{% extends "firstTwigBaseTemplate.html" %})
)