将数组从Symfony控制器发送到javascript



我需要从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);
}

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

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

如果您的项目配置有默认的自动连线选项,您可以自动连线您的存储库(顺便说一句,如果调用与Team实体关联的TeamRepository而不是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头的正确JsonResponsebool $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(箭头键函数是php7.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路由的路径。如果你愿意,你可以检查如何使用它。

最新更新