从 Symfony 控制器发送数组到 javascript

Send array to javascript from Symfony 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);
    }

使用 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 将 return 具有 json headers 的正确 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 路由的路径。如果需要,您可以查看如何使用它。