如何使用 Symfony 从 ajax 请求正确返回 html 模板

sky*_*ner 4 ajax templates symfony twig

我想知道如何从 ajax 调用正确返回 HTML 模板(SEO 友好)。

\n\n

在我的应用程序中,我使用两种不同的方式返回响应:

\n\n

对于简单模板:

\n\n
public function ajaxCallAction() {\n//.....\n    $response = array(\n        "code"      => 202, \n        "success"   => true,\n        "simpleData" => $simpleData\n    );\n\n    return new JsonResponse($response); \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 JS 中我做了类似的事情:

\n\n
$("div#target").click(function(event) {\n    $.ajax({\n        type: "POST",\n        success: function(response) {\n            if(response.code === 202 && response.success) {\n                $("div#box").append(response.simpleData);    \n            }\n        }\n    });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

对于复杂模板(超过 20 行和各种变量):

\n\n
public function ajaxCallAction()\xc2\xa0{\n    //...\n    $listOfObjects = $repo->findAll(); \n    $viewsDatas =\xc2\xa0[\n        \'listOfObjects\' => $listOfObjects,\n        //....other vars\n    ];\n\n    return $this->render(\'myAppBundle:template:complexTemplate.html.twig\', $viewsDatas);\n\n    //in complexTemplate.html.twig, I loop on listOfObjects for example...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于这种调用,JS 如下所示:

\n\n
$("div#target").click(function(event) {\n    $.ajax({\n        type: "POST",\n        success: function(response) {\n            $("div#box").append(response);    \n        }\n    });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

所有这些方法都有效,但是对于第二个方法,我们没有状态代码(这重要吗?)并且我知道返回直接格式化的 html 模板可能很重(例如根据本主题Why is it a bad Practice to return生成 HTML 而不是 JSON?或者是吗?)。

\n\n

你们如何进行ajax调用?这里的最佳实践是什么?

\n

Isa*_*sca 7

在我的应用程序中,我通常使用类似的东西:

$response = array( 
"code" => 200,
"response" => $this->render('yourTemplate.html.twig')->getContent() );
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!

编辑

要返回您的响应,您应该JsonResponse按照文档中的说明使用:http://symfony.com/doc/current/components/http_foundation.html#creating-a-json-response

只需使用:

return new JsonResponse($response);
Run Code Online (Sandbox Code Playgroud)