2011-11-12 29 views
24

我想什麼能夠從任何控制器做的是:創建一個表單作爲Symfony2的服務

$register = $this->get('register_manager'); 
return $this->render(
    'AcmeUserBundle:Account:register.html.twig', 
    array(
     'form' => $register->getRegistrationForm(), 
     ) 
); 

而且在我的模板

<form> 
    {{ form_widget(form) }} 
</form> 

這裏是我如何設定創辦至今

在我Acme/UserBundle/Resources/config/services.yml我有

parameters: 
    register_manager.class: Acme\UserBundle\Manager\RegisterManager 

services: 
    register_manager: 
     class:  %register_manager.class% 
     arguments: [@form.factory] 

RegisterManager.php

namespace Acme\UserBundle\Manager; 

use Acme\UserBundle\Form\Type\RegistrationType; 
use Symfony\Component\Form\FormFactoryInterface; 

class RegisterManager 
{ 

    protected $formFactory; 

    public function __construct(FormFactoryInterface $formFactory) 
    { 
     $this->formFactory = $formFactory; 
    } 


    public function getRegistrationForm() 
    { 
     return $this->formFactory->createBuilder(new RegistrationType()); 
    } 
} 

而在Acme\UserBundle\Form\Type\RegistrationType我:

namespace Acme\UserBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('username','text'); 
     $builder->add('email','email'); 
     $builder->add('password','password'); 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Acme\UserBundle\Entity\User', 
     ); 
    } 

    public function getName() 
    { 
     return 'registration'; 
    } 
} 

我知道RegistrationType()作品我已經在控制器中有它。我的問題是將RegisterManager設置爲服務,我無法在那裏找到合適的組件,但我不確定在哪裏尋找。

+0

你到底遇到了什麼問題? 「你無法得到正確的組件」是什麼意思?現在它應該按預期工作。 – gilden

+0

現在,在我的RegistrationManager服務中,我需要能夠調用'''createForm(new RegistrationType())'''並返回控制器能夠將它傳遞給模板,但我不確定在哪裏定義''''createForm()'''並且如何使它在這個服務類中可用。在Symfony Forms文檔中,它的訪問方式類似於''this-> createForm()'''但我如何在服務類中做到這一點?我不認爲它是'''FormFactoryInterface''的一部分http://symfony.com/doc/current/book/forms.html#creating-form-classes – ed209

+0

FOSUserBundle直接使用form.factory服務,沒有需要一個RegisterManager類,檢查出來,https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/profile.xml – solarc

回答

19

你幾乎就在那裏,看來。爲了讓您的服務Form對象,你應該使用FormFactoryInterface::create(),而不是FormFactoryInterface::createBuilder()

之所以$this->createForm()作品控制器是因爲每個控制器擴展base controller,這恰好實現此方法。

我發現我的IDE能夠鏈接到特定的Symfony文件非常有用,我建議你使用一個,如果你已經不是。還有一個git倉庫,你可以找到here