我想在网站的每个子页面上显示相同的表单。在每个控制器的每个操作中将其传递给Twig是没有意义的。我不想创建某种将表单传递给Twig的BaseController。
我觉得应该可以通过一些配置或服务注入来实现,但我找不到合适的方法。
我已经将form作为服务app_bundle.user.form.type.locale
,但是在哪里注入它以及如何将参数传递给form。
编辑:
表单的action
属性将始终是当前地址,因此它将如下所示的<select action="">
发布于 2016-11-19 02:46:15
有几种方法可以做到这一点。
在基本模板中嵌入另一个控制器
一种方法是制作一个控制器,它将只呈现您需要的表单。然后将该控制器嵌入到基本模板中:
{{ render(controller('AppBundle:MyFormController:form')) }}
这在您的情况下会工作得很好,并且是Symfony文档中推荐的策略之一:Embedding controllers。
使用Twig扩展
另一种方法是使用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';
}
}
有关如何连接您自己的twig扩展的说明,请参阅文档:http://symfony.com/doc/current/templating/twig_extension.html
使用块
第三种方式也很常见,那就是使用“块”。从使用的角度来看,这与嵌入控制器非常相似。主要区别在于,块不会发出子请求。我认为这对你来说并不重要,因为你只需要在一个地方使用它,但是对于在一个页面上有几十个块的网站来说,发出太多的子请求会降低性能,特别是在开发环境中。
虽然您可以使自己的实现变得非常简单,但是您也可以使用现有的包:SonataBlockBundle
发布于 2016-11-19 02:12:25
发布于 2016-11-19 02:43:46
您可以编写一个Twig扩展,该扩展添加一个自定义Twig函数,该函数将使用您的自定义表单类型初始化表单构建器,然后返回创建的视图。创建扩展后,您可以在基本模板中调用新的Twig函数,并照常呈现表单。
请注意,在呈现表单时,必须在模板内显式配置表单操作。否则,它将始终被发送到呈现当前页面的控制器。
https://stackoverflow.com/questions/40682363
复制相似问题