繁体   English   中英

树枝中不存在Symfony变量

[英]Symfony variable does not exist in twig

我有这两个实体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 行中不存在变量“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 %}

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

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

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

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

结果一样。 看起来它只渲染第一个对象,这很奇怪,因为我正在传递一个array() 我错过了什么重要的东西吗? 这可能与cache吗? 我清除了浏览器和学说缓存,仍然没有。 我想不出还有什么原因会导致这种情况。 在同一个控制器中的其他函数中,我在渲染数组时没有问题。

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

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

我找到了解决方案。 我正在使用一个登录表单,在重定向到不同的“主页”之前检查用户的类型。 结果我没有将被检查的user传递给这个sproviderHome函数,而是直接渲染sprovider.html.twig只传递一个变量 -> user

解决方案1

添加

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

到 login 函数并传递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');

向那些努力了却没有结果的人道歉。 我没有提到登录功能的错误。

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

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

改变

{% for job in jobs %}
        {{ jobs.name }}
{% endfor %}

 {% for job in jobs %}
        {{ job.name }}
 {% endfor %}

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

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

添加这个可能会更好

{% if jobs is iterable %}
     {% for job in jobs %}
        {{ job.name }}
     {% endfor %}
{% endif %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM