微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在模板中使用未设置的框架变量时出现 500 错误

如何解决在模板中使用未设置的框架变量时出现 500 错误

我在路由到 MainController::somefunction 的页面上遇到了一个神秘错误

Internal Server Error
Unable to open

[vendor/bcosca/fatfree/lib/base.PHP:2315] Base->error()
[vendor/bcosca/fatfree/lib/base.PHP:3130] user_error()
[tmp/1esys3p2sx9xp.3h31n1yj254w8.PHP:2] Preview->render()
[vendor/bcosca/fatfree/lib/base.PHP:2875] require('/opt/lampp/htdocs/project/tmp/1esys3p2sx9xp.3h31n1yj254w8.PHP')
[vendor/bcosca/fatfree/lib/base.PHP:3121] View->sandBox()
[app/controllers/MainController.PHP:41] Preview->render()
[vendor/bcosca/fatfree/lib/base.PHP:1928] MainController->somefunction()
[vendor/bcosca/fatfree/lib/base.PHP:1728] Base->call()
[index.PHP:12] Base->run()

在我的 MainController::somefunction() 中,一个变量被设置为模板

$this->f3->set('content','products.htm');
echo \Template::instance()->render('layout.htm');

在 layout.htm 中有以下一行

    <include href="{{ @contents }}" />

错误消息没有提供太多有用的细节。我花了一段时间才发现该变量在函数中被定义为“content”,但模板引用了“contents”——有一个遗漏的“s”。

如果错误可以说诸如“未定义的变量”之类的东西会更有帮助。也许这些信息会让人摸不着头脑。

解决方法

主要问题是您的 PHP 配置忽略了诸如未定义变量之类的“小问题”。让PHP通过调用error_reporting(E_ALL)(加载F3后)报告各种问题。从技术上讲,E_NOTICE 足以报告未定义的变量。一旦设置了这个标志,PHP 就可以显示/记录(取决于您的配置)警告,并且 Fat-Free Framework 的 ONERROR 处理程序可以对未定义的变量做出反应

Undefined variable: contents
[tmp/21hg1fh3jezo8.1gkglltf97qxb.php:1] Base->{closure}()
[test.php:16] Preview->render()

我也建议将警告提升为异常。 documentation page of set_error_handler() 的注释中显示了一个很好的示例。此更改迫使您进行防御性编程并揭示问题,否则这些问题要么被忽视,要么会导致意外的副作用(例如您的问题)。

随意针对 bcosca/fatfree-core 创建拉取请求,当 null 文件传递​​给模板渲染器时,它会生成有用的错误消息。

,

@Alan T,@alan-t,对;本周刚从 F3 开始,两天前我也遇到了同样的问题;我的 2 美分:当发生类似的事情时,无论您使用的是什么框架或库,都可以在整个项目范围内进行文件搜索;例如,在您的情况下,您可以搜索“无法打开”以查看错误的确切位置,并且由于显示了确切行号的跟踪,我很幸运地找到了罪魁祸首。(不是这种情况您的问题/统计跟踪)

非常感谢@Rayne 提供有关加载 F3 后调用 error_reporting(E_ALL) 的所有宝贵信息
尤其是在促进对例外情况的警告方面;我将在回复后立即更新我的代码库

感谢所有帮助初学者的人,到目前为止我认为这是一个非常有效的打包框架!当我们花时间深入研究时,官方文档中充满了聪明的代码示例!感谢所有 f3 人

最好的问候 拉斐尔

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。