Php 包含模板中不存在Symfony3变量

Php 包含模板中不存在Symfony3变量,php,twig,symfony,Php,Twig,Symfony,我得到以下错误:变量“file”不存在 包含的模板Contractor:file.html.twig如下所示: {{ dump(file) }} {% extends '::base.html.twig' %} {% form_theme form 'NaSoftEdmBundle:Form:fields.html.twig' %} ... {% block files %} {% for file in form.files %} {{ include('NaSoftEdm

我得到以下错误:变量“file”不存在

包含的模板Contractor:file.html.twig如下所示:

{{ dump(file) }}
{% extends '::base.html.twig' %}
{% form_theme form 'NaSoftEdmBundle:Form:fields.html.twig' %}

...

{% block files %}
  {% for file in form.files %}
     {{ include('NaSoftEdmBundle:Contractor:file.html.twig', {'file': file}) }}
  {% endfor %}
{% endblock %}
主模板form.html.twig如下所示:

{{ dump(file) }}
{% extends '::base.html.twig' %}
{% form_theme form 'NaSoftEdmBundle:Form:fields.html.twig' %}

...

{% block files %}
  {% for file in form.files %}
     {{ include('NaSoftEdmBundle:Contractor:file.html.twig', {'file': file}) }}
  {% endfor %}
{% endblock %}
控制器:

public function editAction(Request $request, Contractor $contractor)
{
    ...
    return $this->render('NaSoftEdmBundle:Contractor:form.html.twig', array(
        'form' => $form->createView(),
    ));
}

但是,当我尝试在主模板文件(form.html.twig)中显示变量时,该变量变为可用:

{% for file in form.files %}
   {{ dump(file) }} {# it work! #}
{% endfor %}


ContractorFile {#499 ▼
 -id: 154
 -uploadedFile: null
 -name: "57c6d217d9a92.jpg"
 -origName: "1471590585502.jpg"
 -path: "/contractor/docs/files/2/335"
 -size: 153536
 -mimeType: "image/jpeg"
 -updateDate: DateTime {#496 ▶}
 -contractor: Contractor {#370 ▶}
}

command
php应用程序/控制台缓存:clear
没有帮助

将变量传递给Twig
include
的正确方法是:

{% include 'NaSoftEdmBundle:Contractor:file.html.twig' with {'file': file} %}
正如@walther在评论中指出的,实际上不需要传递变量,因为包含的模板可以访问活动上下文的变量,即,您可以简单地编写:

{% include 'NaSoftEdmBundle:Contractor:file.html.twig' %}
并且将使用
文件
变量

如果要分配一个新变量,您仍然必须使用
with
语法,例如

{% include 'NaSoftEdmBundle:Contractor:files.html.twig' with {'files': form.files} %}

请参见

将变量传递给细枝的正确方法是包含命令:

{% include 'NaSoftEdmBundle:Contractor:file.html.twig' with {'file': file} %}
正如@walther在评论中指出的,实际上不需要传递变量,因为包含的模板可以访问活动上下文的变量,即,您可以简单地编写:

{% include 'NaSoftEdmBundle:Contractor:file.html.twig' %}
并且将使用
文件
变量

如果要分配一个新变量,您仍然必须使用
with
语法,例如

{% include 'NaSoftEdmBundle:Contractor:files.html.twig' with {'files': form.files} %}

请参见

问题在于,在开始周期之前,“for”包含了属性数据原型的相同模板

data-prototype="{% filter escape %} 
     {% include 'NaSoftEdmBundle: Contractor: file.html.twig' with { '_form':form.files.vars.prototype} %}
{% endfilter %}"
我已经为属性“DataPrototype”创建了一个新模板,它成功了

data-prototype="{% filter escape %} 
     {% include 'NaSoftEdmBundle: Contractor: filePrototype.html.twig' with { 'file':_form.files.vars.prototype} %}
{% endfilter %}"

这是为了自定义模板集合而实现的问题是,在开始周期“for”之前,我为属性数据原型包含了相同的模板:

data-prototype="{% filter escape %} 
     {% include 'NaSoftEdmBundle: Contractor: file.html.twig' with { '_form':form.files.vars.prototype} %}
{% endfilter %}"
我已经为属性“DataPrototype”创建了一个新模板,它成功了

data-prototype="{% filter escape %} 
     {% include 'NaSoftEdmBundle: Contractor: filePrototype.html.twig' with { 'file':_form.files.vars.prototype} %}
{% endfilter %}"

这是为了自定义模板集合而实现的

Whoops!谢谢你指出我的错误。修正了答案,没问题。顺便问一下,在这种情况下,仅仅包含文件就足够了吗?根据文档,包含的文件应该可以访问当前上下文的变量。现在无法测试,所以不确定。您再次正确:-)我现在测试了它。我扩展了我的答案,给出了所有可用的选项。我遵循了以下文档:仍然不工作(我无法将任何变量发送到file.html.twigf,因为某些原因,它无法在twigwoops中使用继承变量!感谢您指出我的错误。修复了答案。没问题。顺便问一下,在这种情况下,仅包含该文件就够了吗?根据文档,包含的文件应该可以访问当前上下文的变量。现在无法测试它,所以不确定。您再次正确:-)我现在测试了它。我扩展了我的答案以提供所有可用的选项。我被以下文档指导:仍然不工作(我无法将任何变量发送到file.html.Twig,因为某些原因它在Twig中不工作继承变量