我正在研究一个带有symfony 3的项目,我希望通过他们正在处理的项目名称从数据库中动态获取用户列表。
这是控制器动作:
这种方式它没有显示任何内容,它只显示第一个用户,如果我以这种方式编写动作:
答案 0 :(得分:1)
如果我理解正确,你有一个页面,你有一个AJAX请求,它将返回一些已经用树枝渲染的数据。
您需要做的是:
一个返回普通HTML页面的控制器
第二个控制器返回与第一个控制器相同的渲染数据,但是这个控制器使用的模板只包含将由AJAX请求返回的HTML。
在您的AJAX请求中,调用第二个控制器中定义的路由并显示结果。
例1:
ControllerOne.php:
class ControllerOne extends Controller
{
/**
* @Route("/")
* @return \Symfony\Component\HttpFoundation\Response
*/
public function indexAction()
{
// show your page
return $this->render('index.html.twig');
}
}
ControllerTwo.php:
class ControllerTwo extends Controller
{
/**
* @Route("get/data/{userId}")
* @param $userId
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getDataAction($userId)
{
// get some data
$em = $this->getDoctrine()->getManager();
// this example shows retrieving user data
// implement your logic for retrieving projecty by user id here
$userData = $em->getRepository('AppBundle:User')->findOneBy(array('id' => $userId));
return $this->render('user.data.html.twig', array('user' => $userData));
}
}
index.html.twig:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="application/javascript">
// call the controller to get the rendered data
$.ajax({
url: "/get/data/1"
})
.done(function( data ) {
// insert data into div
$("#myDiv").html(data);
});
</script>
</body>
</html>
user.data.html.twig:
<div>
<p>
<!-- you have access to the data passed from controller here -->
User name: {{user.name}}
</p>
</div>
例2:
JsonResponseController.php:
class JsonResponseController extends Controller
{
/**
* @Route("get/data/{userId}")
* @param $userId
* @return \Symfony\Component\HttpFoundation\Response
*/
public function getDataAction($userId)
{
// get some data
$em = $this->getDoctrine()->getManager();
// this example shows retrieving user data
// implement your logic for retrieving projecty by user id here
$userData = $em->getRepository('AppBundle:User')->findOneBy(array('id' => $userId));
return new JsonResponse(array('userData' => $userData));
}
}