You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 7中如何通过Twig模板生成JSON响应?

解决Symfony 7中用Twig模板生成jstree JSON响应的问题

核心问题分析

你的代码错误在于用JsonResponse包裹了Twig渲染后的字符串。JsonResponse的作用是将PHP数据结构序列化为JSON字符串,而你传入的已经是Twig生成的JSON字符串,这会导致双重序列化(或解析错误),最终返回空内容或格式错误的响应。

正确解决方案

1. 修改控制器返回逻辑

直接返回Response对象,手动设置JSON的Content-Type头,避免JsonResponse的额外处理:

use Symfony\Component\HttpFoundation\Response;

// 控制器方法内
public function getNodes(NodesRepository $nodesRepository): Response
{
    return new Response(
        $this->renderView('nodes/jsonnodes.json.twig', [
            'nodes' => $nodesRepository->findAll()
        ]),
        Response::HTTP_OK,
        ['Content-Type' => 'application/json']
    );
}

2. 编写正确的Twig JSON模板

确保jsonnodes.json.twig生成符合jstree要求的JSON结构,同时处理递归子节点和JSON语法规范:

[
{% for node in nodes %}
    {
        "id": "{{ node.id }}",
        "text": "{{ node.name|e('json') }}",
        "children": {% if node.children is not empty %}
            {{ include('nodes/jsonnodes.json.twig', {'nodes': node.children}) }}
        {% else %}
            []
        {% endif %}
    }{% if not loop.last %},{% endif %}
{% endfor %}
]
  • 用|e('json')过滤器转义字符串中的特殊字符(比如引号、换行),避免JSON语法错误。
  • 递归渲染子节点,适配jstree的层级结构。
  • 处理循环末尾的逗号,确保JSON格式合法。

3. 排查常见错误点

  • 确认数据存在:检查$nodesRepository->findAll()是否返回有效数据,可通过dump($nodesRepository->findAll())调试。
  • 模板路径正确性:运行php bin/console debug:twig命令,确认nodes/jsonnodes.json.twig已被Symfony识别。
  • 实体属性可访问性:确保节点实体的id、name、children属性有对应的getter方法(如getId()、getName()),Twig会自动调用这些方法获取值。
  • 避免多余空白:模板开头/结尾不要留空行,否则会导致JSON格式错误。

内容的提问来源于stack exchange,提问作者mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:11:11