Symfony2 Twig扩展:创建表单

ben*_*h-o 2 forms symfony twig

我希望有一个联系表单块,我可以在不同的页面和模板上重用.所以我决定写一个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(),
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到错误"调用未定义的方法createFormBuilder()"...

如果我将功能更改为,我也会收到错误 function contactform(Request $request) { ... }

我需要添加什么来使用这个函数一个对象?或者枝条延伸可能是完全错误的方法?

Ahm*_*ani 7

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

不在此处使用"控制器上下文",因此如果您想form.factory在扩展程序中使用该服务,则必须注入它.

但,

我不会建议您以contactForm这种方式管理(使用Twig Extension功能).为什么不在contactAction适当的控制器中创建一个.然后,您可以使用twig renderhelper 在模板中呈现表单,

{{ render(controller('YourBundle:YourController:contactAction')) }} 
Run Code Online (Sandbox Code Playgroud)