Php 如何在Symfony 3中创建将显示在页眉中每个子页面上的表单

Php 如何在Symfony 3中创建将显示在页眉中每个子页面上的表单,php,dependency-injection,symfony,symfony-forms,Php,Dependency Injection,Symfony,Symfony Forms,我想在网站的每个子页面上显示相同的表单。在每个控制器的每一个动作中把它传递给细枝是没有意义的。我不想创建某种BaseController来将表单传递给Twig 我觉得通过一些配置或服务注入应该是可能的,但我找不到合适的方法 我已经有了表单即服务app\u bundle.user.form.type.locale,但是在哪里注入它以及如何向表单传递参数 编辑: 表单的action属性将始终是当前地址,因此看起来像这样您熟悉Twig的{%extends…%}语法吗 你可以读到 这似乎是最好的解决方案

我想在网站的每个子页面上显示相同的表单。在每个控制器的每一个动作中把它传递给细枝是没有意义的。我不想创建某种BaseController来将表单传递给Twig

我觉得通过一些配置或服务注入应该是可能的,但我找不到合适的方法

我已经有了表单即服务
app\u bundle.user.form.type.locale
,但是在哪里注入它以及如何向表单传递参数

编辑:


表单的
action
属性将始终是当前地址,因此看起来像这样

您熟悉Twig的
{%extends…%}
语法吗

你可以读到


这似乎是最好的解决方案…

您可以编写一个细枝扩展,其中添加一个自定义细枝函数,该函数将使用自定义表单类型初始化表单生成器,然后返回创建的视图。创建扩展之后,您可以在基础模板中调用新的细枝函数,并像往常一样呈现表单


请注意,在呈现表单时,必须在模板内显式配置表单操作。否则,它将始终发送到呈现当前页面的控制器。

有几种方法可以做到这一点

在基础模板中嵌入另一个控制器 一种方法是制作一个只呈现所需形状的控制器。然后将该控制器嵌入基础模板中:

{{ render(controller('AppBundle:MyFormController:form')) }}
这将在您的情况下很好地工作,并且是Symfony文档中推荐的策略之一:

使用细枝延伸 另一种方法是使用细枝扩展。您可以创建一个细枝扩展,它将实现一个返回表单的函数

大致如下:

class AppExtension extends \Twig_Extension
{
    private $formFactory;

    public function __construct(FormFactory $formFactory)
    {
        $this->formFactory = $formFactory;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('create_my_form', array($this, 'createMyForm')),
        );
    }

    public function createMyForm()
    {
        return $this->formFactory->create(MyFormType::class);
    }

    public function getName()
    {
        return 'app_extension';
    }
}
有关如何连接您自己的细枝扩展的说明,您可以参考以下文档:

使用块 第三种也是相当常见的方法是使用“块”。从使用角度来看,这与嵌入控制器非常相似。主要区别在于块不发出子请求。我认为这在您的情况下并不重要,因为您只需要一次,但是对于在一个页面上有几十个块的网站,发出太多的子请求可能会降低性能,特别是在开发环境中


虽然您可以使自己的实现变得非常简单,但也可以使用现有的捆绑包:

您可以在twig和action中构建manualy表单,然后该表单将成为Controller的名称。在这个控制器中,您可以从请求对象获取值。但是,我必须在每个构造函数的每个操作中传递值。最好将请求注入FormType服务。我想要实现的是将这个表单服务注入到模板中,然后由其他模板扩展。一个操作就足够了。例如,您创建了SearchBundle,并且SearchBundle具有带有SearchAction(name=“Search\u action”)的SearchController。在Twig中,您创建的表单和此表单中的操作将是{{search_action}}。我知道这不是服务,但对我来说是完美的:)我对此很熟悉。但这似乎不是解决办法,因为我必须以某种方式将表格传递给细枝。仅扩展/
嵌入
/
包含
一些模板是不够的,我已经在做了。模板必须以某种方式注入某种形式。