树枝

时间:2016-04-11 09:11:34

标签: php symfony

我有这两个实体Users.phpsprovider.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.",
        ));
    }
}

结果sprovider.html.twig

  

变量"工作"在home / sprovider.html.twig第8行不存在

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 %}

这里奇怪的是$user存在但$jobs没有。

我到目前为止尝试的是转储jobs并且没有问题,作业都在变量中。

我尝试的另一件事是传递这样的字符串:

return $this->render('home/sprovider.html.twig', array(
            'user' => $user,
            'jobs' => 'jobs',
        ));

结果相同。看起来它只渲染了第一个奇怪的对象,因为我传递的是array()。我错过了重要的事吗?这可能与cache有关吗?我清除了浏览器和doctrine缓存,但仍然没有。我无法想到任何其他原因导致这一点。在同一个控制器的其他函数中,我没有渲染数组的问题。

3 个答案:

答案 0 :(得分:3)

如果之前没有定义放置条件的 jobs 变量,则可以使循环安全。

{% if jobs is defined %}
    {% for job in jobs %}
        {{ job.name }}
    {% endfor %}
{% else %}
    No jobs found.
{% endif %}

答案 1 :(得分:1)

您需要首先检查该作业是否存在。

{% if jobs is defined %}
    {% for job in jobs %}
        {{ job.name }}
    {% endfor %}
{% else %}
    Something else
{% endif %}

答案 2 :(得分:0)

我找到了解决方法。我正在使用登录表单,在重定向到不同的“主页”之前检查用户的类型。事实证明我没有将选中的user传递给此sproviderHome函数,而是直接渲染sprovider.html.twig只传递了一个变量 - &gt; user

解决方案1 ​​

添加

$jobs = $this->getDoctrine()
        ->getRepository('AppBundle:jobs')
        ->findAll();

登录功能并传递userjobs,然后摆脱sproviderHome功能。

解决方案2 更整洁的解决方案

我使用

而不是登录功能中的return $this->render(........)
return $this->forward('AppBundle:User:sproviderHome', array(
                'user'=>$user
            ));

然后将$user作为参数添加到sproviderHome函数中。然后添加

$jobs = $this->getDoctrine()
        ->getRepository('AppBundle:jobs')
        ->findAll();

在函数中,这一切都很好。还要删除Request $request作为参数并删除这两行

 $email = $request->get('email');
 $password = $request->get('password');

向那些尽力而为但没有结果的人道歉。我没有提到登录功能的错误。