从 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);
}
您也不应该设置 JsonResponse
的 bool $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
路由的路径。如果需要,您可以查看如何使用它。
我需要从控制器发送数据数组,但我不知道什么是好的方法。我认为控制器应该在 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);
}
您也不应该设置 JsonResponse
的 bool $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
路由的路径。如果需要,您可以查看如何使用它。