我希望有一个联系表单块,我可以在不同的页面和模板上重复使用。所以我决定写一个Twig扩展。问题是我无法访问createFormBuilder()函数。第二个问题是我无法访问请求对象进行验证。我目前的代码如下:
<?php
namespace Name\NameBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class ContactExtension extends \Twig_Extension
{
function getName() {
return 'contact_extension';
}
function getFunctions() {
return array(
'contactform' => new \Twig_Function_Method($this, 'contactform'),
);
}
function contactform() {
$form = $this->createFormBuilder()
->add('Name', 'text')
->add('Message', 'textarea')
->add('Send', 'submit')
->getForm();
return $this->render('NameBundle:forms:contactform.html.twig', array(
'form' => $form->createView(),
}
}
但我收到错误&#34;调用未定义的方法createFormBuilder()&#34; ...
如果我将功能更改为function contactform(Request $request) { ... }
我需要添加什么才能将此功能用作对象?或者枝条延伸可能是完全错误的方法?
答案 0 :(得分:8)
createFormBuilder()
是一个Controller帮助程序,允许您通过容器访问控制器中的form.factory
服务(下面的代码)
namespace Symfony\Bundle\FrameworkBundle\Controller;
// ...
class Controller extends ContainerAware
{
// ...
public function createFormBuilder($data = null, array $options = array())
{
return $this->container->get('form.factory')->createBuilder('form', $data, $options);
}
您在“控制器上下文”中不,因此如果您想在扩展程序中使用form.factory
服务,则必须注入
<强> BUT,强>
我不会建议您以这种方式管理您的contactForm
(使用Twig Extension功能)。为什么不在适当的控制器中创建contactAction
。然后,您可以使用twig render
帮助程序
{{ render(controller('YourBundle:YourController:contactAction')) }}
答案 1 :(得分:0)
如果你使用Symfony来清除你的代码,你应该在不同的文件中创建Forms(src / forms),然后在你的视图和控制器中调用它。