我有这两个实体Users.php和sprovider.php一个UserController.php
困扰我的是当我尝试在此函数中呈现模板时的结果。
/**
* @Route("/sproviderhome", name="sprovider_home")
*/
public function sproviderHomeAction(Request $request){
$email = $request->get('email');
$password = $request->get('password');
$user= $this->getDoctrine()
->getRepository('AppBundle:Users')->
findOneBy(array('email' => $email, 'password' => $password));
$jobs = $this->getDoctrine()
->getRepository('AppBundle:jobs')
->findAll();
if($user){
return $this->render('home/sprovider.html.twig', array(
'user' => $user,
'jobs' => $jobs,
));
}else{
return $this->render('home/login.html.twig', array(
'message' => "Sorry, you need to login first.",
));
}
}
Run Code Online (Sandbox Code Playgroud)
结果sprovider.html.twig:
home/sprovider.html.twig 第 8 行中不存在变量“jobs”
sprovider.html.twig:
{% extends '::base.html.twig' %}
{% block body %}
{% if user is defined %}
<h2 class="page-header">Welcome {{ user.name }}</h2>
{% endif %}
{% for job in jobs %}
{{ job.name }}
{% endfor %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它$user存在但$jobs不存在。
到目前为止我尝试的是转储,jobs没有问题,工作在变量中。
我尝试的另一件事是传递这样的字符串:
return $this->render('home/sprovider.html.twig', array(
'user' => $user,
'jobs' => 'jobs',
));
Run Code Online (Sandbox Code Playgroud)
结果一样。看起来它只渲染第一个对象,这很奇怪,因为我传递了一个array(). 我错过了什么重要的东西吗?这跟这有关系cache吗?我清除了浏览器和学说缓存,仍然没有。我想不出还有什么原因会导致这种情况。在同一个控制器中的其他函数中,我在渲染数组时没有问题。
如果之前没有定义放置条件的作业变量,您可以使循环安全。
{% if jobs is defined %}
{% for job in jobs %}
{{ job.name }}
{% endfor %}
{% else %}
No jobs found.
{% endif %}
Run Code Online (Sandbox Code Playgroud)
我找到了解决这个问题的方法。我正在使用登录表单,在重定向到不同的“主页”之前检查用户的类型。结果我没有将检查传递user给这个sproviderHome函数,而是直接渲染sprovider.html.twig只传递了一个变量 -> user。
解决方案1
添加
$jobs = $this->getDoctrine()
->getRepository('AppBundle:jobs')
->findAll();
Run Code Online (Sandbox Code Playgroud)
到登录函数并传递user和jobs,然后删除该sproviderHome函数。
解决方案2 更简洁的解决方案
我没有return $this->render(........)在登录功能中使用
return $this->forward('AppBundle:User:sproviderHome', array(
'user'=>$user
));
Run Code Online (Sandbox Code Playgroud)
然后$user作为参数添加到sproviderHome函数中。然后加
$jobs = $this->getDoctrine()
->getRepository('AppBundle:jobs')
->findAll();
Run Code Online (Sandbox Code Playgroud)
在功能上一切都很好。还要摆脱Request $request作为参数并删除这两行
$email = $request->get('email');
$password = $request->get('password');
Run Code Online (Sandbox Code Playgroud)
向那些尽了最大努力却没有结果的人表示歉意。我的错误是没有提到登录功能。
| 归档时间: |
|
| 查看次数: |
21704 次 |
| 最近记录: |