从 Symfony 控制器发送数组到 javascript

Posted

技术标签:

【中文标题】从 Symfony 控制器发送数组到 javascript【英文标题】:Send array to javascript from Symfony controller 【发布时间】:2021-12-17 18:42:23 【问题描述】:

我需要从 Controller 发送数据数组,但我不知道什么是好方法。我认为控制器应该以 json 格式发送数组。 这是我的js代码:

 $.typeahead(
        input: '[data-autocomplete="team"]',
        minLength: 1,
        order: "asc",
        offset: true,
        hint: true,
        source: 
             items: 
                 data: [here, i need to get array data from controller]
                 ajax: 
                     type: "POST",
                     url: "/teams",
                     data: 
                         myKey: $('[data-autocomplete="team"]').val()
                     
                 
             
         ,
    );

这是我的控制器

    /**
     * @Route(name="teams", path="/teams")
     */
    public function sendTeams()
    
        $em = $this->getDoctrine()->getManager();
        $teams = $em->getRepository(Teams::class)->findAll();
        $data = [];
        foreach($teams as $team)
           $data[] = $team->getName();
        

        return new JsonResponse($data, 200, [], true);
    

【问题讨论】:

【参考方案1】:

使用 JsonReponse 是一个合适的解决方案。

但是有多种方法可以改进您的代码。

如果你的项目配置了默认的自动装配选项,你可以自动装配你的存储库(顺便说一下,如果调用TeamRepository 关联到Team 实体而不是Teams 会更好)

/**
 * @Route(name="teams", path="/teams")
 */
public function sendTeams(TeamsRepository $teamsRepository)

    $teams = $teamsRepository->findAll();
    $data = [];
    foreach($teams as $team)
       $data[] = $team->getName();
    

    return new JsonResponse($data, 200, [], true);

您也不应该设置JsonResponsebool $json 参数,因为$data 不是一个json,而是一个您希望转换为json 的数组。 使用JsonResponse 将返回带有 json 标头 的正确 JsonResponse,bool $json 参数仅有助于将 php 变量转换为 json(如果可能)。

/**
 * @Route(name="teams", path="/teams")
 */
public function sendTeams(TeamsRepository $teamsRepository)

    $teams = $teamsRepository->findAll();
    $data = [];
    foreach($teams as $team)
       $data[] = $team->getName();
    

    return new JsonResponse($data);

你也可以简化你的 foreach (箭头键功能是 php 7.4+,否则使用常规调用)

/**
 * @Route(name="teams", path="/teams")
 */
public function sendTeams(TeamsRepository $teamsRepository)

    $teams = $teamsRepository->findAll();
    $data = array_map(fn($e) => $e->getName(), $teams);

    return new JsonResponse($data);

这取决于你,但你也可以使用FOSJsRoutingBundle 来不手动写入teams 路由的路径。您可以根据需要查看如何使用它。

【讨论】:

感谢改进,我将应用它们,但是,控制器和 javascript 之间有问题,因为它无法正常工作......如果我在 javascript 中对数组进行硬编码工作正常,但通过控制器,它不起作用。 您在 javascript 中接收数据的方式应该存在问题。您可以尝试检查您的网址,看看您是否获得了正确的 json (url.com/teams)。 github.com/twitter/typeahead.js/blob/master/doc/… 文档似乎说您需要将asyncResults 与ajax 请求一起使用 你是对的,非常感谢你的帮助

以上是关于从 Symfony 控制器发送数组到 javascript的主要内容,如果未能解决你的问题,请参考以下文章

Symfony表单不向控制器发送文件

在 symfony2 中创建表

使用Ajax(无表单)将POST数据以JSON格式发送到Symfony2 Controller

Laravel:将多维数组从视图发送到控制器?

Symfony2:控制器中动作/路由的完整路径

将数组数据从一个视图控制器发送到另一个