Seb*_*ski 5 php dependency-injection symfony-forms symfony
我想在网站的每个子页面上显示相同的表单。在每个控制器的每个动作中将其传递给 Twig 是没有意义的。我不想创建某种将表单传递给 Twig 的 BaseController。
我觉得通过一些配置或服务注入应该可以,但我找不到合适的方法。
我已经将表单作为服务app_bundle.user.form.type.locale
,但是在哪里注入它以及如何将参数传递给表单。
编辑:
action
表单的属性始终是当前地址,因此它看起来像这样<select action="">
有几种方法可以做到这一点。
一种方法是制作一个控制器,仅呈现您需要的表单。然后,您可以将该控制器嵌入到您的基本模板中:
{{ render(controller('AppBundle:MyFormController:form')) }}
Run Code Online (Sandbox Code Playgroud)
这在您的情况下效果很好,并且是 Symfony 文档中推荐的策略之一:嵌入控制器。
另一种方法是使用 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