Twig模板include语句传入对象报array expected错误如何解决?
问题原因
Twig 的 include 语句中 with 关键字仅支持传入数组类型的上下文参数,原生不允许直接传入对象,所以使用对象数组时会抛出 array expected, got Object 错误。
解决方案
- 方案1:PHP 端预处理(最推荐)
在把things变量传递给 Twig 模板前,提前将数组内的所有对象转为关联数组。自定义类可新增toArray()方法封装属性转换逻辑,通用对象可直接用get_object_vars()或者序列化反序列化的方式完成转换:
// 示例:PHP端转换对象数组为二维数组 $things = array_map(function($item) { // 通用对象转关联数组,不包含私有属性的话也可以用 get_object_vars($item) return json_decode(json_encode($item), true); }, $things); // 再将转换后的$things传给Twig模板
原模板中的遍历逻辑不需要做任何修改即可正常运行。
- 方案2:Twig 模板内手动拼装上下文数组
如果不方便修改 PHP 端代码,可在 include 时手动把模板需要用到的对象属性拼装成数组传入:
{% for thing in things %} {{ include 'template.html' with { id: thing.id, title: thing.title, // 其他 template.html 需要用到的属性,按需添加 } only }} {% endfor %}
- 方案3:对象类实现 ArrayAccess 接口
如果该类对象需要在多个 Twig 场景中被当作数组使用,可以给对象所属的类实现 PHP 内置的ArrayAccess接口,实现对应方法后 Twig 会将该类实例识别为可数组访问的类型,不会再触发类型校验错误。
内容的提问来源于stack exchange,提问作者exussum
相关产品推荐
相关产品推荐

