【问题标题】:How to return an array to twig in symfony2 and how to use it?如何在 symfony2 中将数组返回给 twig 以及如何使用它?
【发布时间】:2015-07-08 13:58:20
【问题描述】:

我在控制器中编写了一个动作。我想将“结果”数组传递给树枝文件,并且还想通过 for 循环使用它。

这是我在控制器中的操作代码

public function searchBookAction(Request $request)
{
       $q="PC";
       $conn = $this->get('database_connection');
       $results = $conn->fetchAll("SELECT name FROM products where name like '%".$q."%'");
    return array('results' => $results);
}

这是我的树枝代码:

{%for data in results%}
<li>{{ data.name|e }}</li>
{% endfor %}
</ul>

在此代码中,我收到此错误: NimoProBundle:Product:product.html.twig 中不存在变量“结果”

【问题讨论】:

    标签: php symfony symfony-2.6


    【解决方案1】:

    你应该在控制器上使用$this-&gt;render()

    return $this->render('template.html.twig', array(
        'data' => $results,
    ));
    

    在 Twig 中你做得很好。也不要使用这样的连接。更好地为您的模型使用 Doctrine ORM。

    注意:

    如果你想使用渲染方法,那么你需要扩展

    Symfony\Bundle\FrameworkBundle\Controller\Controller;

    这样做放

    use Symfony\Bundle\FrameworkBundle\Controller\Controller;

    在班级名称之上并在您的班级上使用extend

    你也可以使用

    class YourController extends Symfony\Bundle\FrameworkBundle\Controller\Controller

    但这不是很好的解决方案

    这对你来说是个好讲座:

    【讨论】:

    • 但我不想渲染控件我只想简单地返回一个数组
    • 我正在从 javascript 调用 searchBookAction(),所以我只需要 $results 数组就可以在树枝页面上使用
    • 那为什么不使用 JSON 呢?那么您需要return json_encode($results); 或使用Symfony\Component\HttpFoundation\JsonResponse 并在javascript 中添加元素。您还可以将 HTML 返回到 ajax 响应,并且可以按上述方式完成。
    • 如何在 javascript 中获取 json?
    • 通过 ajax 调用和 jquery 你可以使用 getJSON api.jquery.com/jquery.getjson
    【解决方案2】:

    如果您想从 javascript 调用使用 searchBookAction(正如您在评论中提到的那样),我建议您查看 JsonResponse。 它所做的是将数组解析为 JsonFormat。 json可以通过javascript毫无问题地解码。

    在您的控制器中:

    public function searchBookAction(Request $request)
    {
        $q="PC";
        $conn = $this->get('database_connection');
        $results = $conn->fetchAll("SELECT name FROM products where name like '%".$q."%'");
        return new JsonResponse(array('results' => $results);
    }
    

    在您的 javascript 代码中(我假设您使用的是 jQuery 而不是自己编写请求):

    <script>
    $.get('path/to/your/controller', {}, function(response){
        response.results  //<- here you have your results
    });
    </script>
    

    【讨论】:

    • 对'path/to/your/controller'有点困惑,你能写一个示例路径吗?
    • 您可以在此处阅读有关“path/to/your/controller/”的信息:symfony.com/doc/current/book/routing.html。它将调用 searchBookAction 的 URL。在 twig 中使用该代码究竟是什么意思?您是否需要将您的项目放在同一页面上并且需要处理这些项目,或者您需要一个产生结果的页面,然后您从另一个页面读取这些结果?
    • 我希望在我的树枝页面中使用该 Json
    • 嗯,尝试更新您的 searchBookAction,就像我在评论中所写的那样,然后将其放在您的树枝页面中:&lt;script&gt; var data = {{ render(controller('NimoProBundle:CONTROLLER_NAME:searchBook')) |raw }}; alert(data.results.join(','));&lt;/script&gt; 它有效吗?它是否返回任何错误?
    • 但它在 javascript 块中我想在 javascript 块之外使用它
    【解决方案3】:

    因为你不想在你的控制器中渲染任何东西:

    如果数组不是实体,那么您可以使用JsonResponse 类,通过序列化将数组转换为 JSON 格式。

    在您的控制器中使用:return new JsonResponse(array('name' =&gt; $name));

    然后您可以在您的 javascript 中使用 resp = JSON.parse(your_json_response); 对其进行解码,或者直接转储到您的树枝中。或者在twig中解码。

    【讨论】:

    • 你可能做错了/错过了一些事情。我已经用了很长时间了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2011-08-29
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多