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

Seb*_*ski 5 php dependency-injection symfony-forms symfony

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

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

我已经将表单作为服务app_bundle.user.form.type.locale,但是在哪里注入它以及如何将参数传递给表单。

编辑:

action表单的属性始终是当前地址,因此它看起来像这样<select action="">

Igo*_*vić 6

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

在基本模板中嵌入另一个控制器

一种方法是制作一个控制器,仅呈现您需要的表单。然后,您可以将该控制器嵌入到您的基本模板中:

{{ render(controller('AppBundle:MyFormController:form')) }}
Run Code Online (Sandbox Code Playgroud)

这在您的情况下效果很好,并且是 Symfony 文档中推荐的策略之一:嵌入控制器

使用 Twig 扩展

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

沿着这些思路:

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';
    }
}
Run Code Online (Sandbox Code Playgroud)

有关如何连接您自己的树枝扩展的说明,您可以参考文档:http://symfony.com/doc/current/templatating/twig_extension.html

使用块

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

虽然您可以非常轻松地实现自己的实现,但您也可以使用现有的包:SonataBlockBundle


Alv*_*unk -1

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

您可以在此链接中阅读有关继承的内容。

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