我需要从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);
}
您也不应该设置JsonResponse
的bool $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(箭头键函数是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
路由的路径。如果你愿意,你可以检查如何使用它。