2011-11-12 10 views
24

Quello che mi piacerebbe essere in grado di fare da qualsiasi controller è:Creare un modulo come un servizio in Symfony2

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

E nel mio modello

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

Ecco come ho impostato fino ad oggi

Nel mio Acme/UserBundle/Resources/config/services.yml devo

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

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

In RegisterManager.php ho

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()); 
    } 
} 

E in Acme\UserBundle\Form\Type\RegistrationType ho:

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'; 
    } 
} 

So che le RegistrationType() opere come ho avuto in un controller. Il mio problema è con la creazione di RegisterManager come servizio, non riesco a ottenere i componenti giusti lì e non sono sicuro dove cercare.

+0

Qual è esattamente il problema che stai incontrando? Cosa intendi per "non è possibile ottenere i componenti giusti"? In questo momento dovrebbe funzionare come previsto. – gilden

+0

in questo momento, nel mio servizio di RegistrationManager devo essere in grado di chiamare '' 'createForm (new RegistrationType())' '' e restituire che per il controller sia in grado di passarlo al template ma non sono sicuro di dove '' 'createForm()' '' è definito e come renderlo disponibile in questa classe di servizio. Nella documentazione di Symfony Forms si accede come '' '$ this-> createForm()' '' ma come dovrei farlo nella mia classe di servizio? Non penso che faccia parte di '' 'FormFactoryInterface''' http://symfony.com/doc/current/book/forms.html#creating-form-classes – ed209

+0

FOSUserBundle utilizza direttamente il servizio form.factory senza hai bisogno di una classe di RegisterManager, dai un'occhiata, https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/profile.xml – solarc

risposta

19

Sei quasi arrivato, a quanto pare. Per ottenere un oggetto Form dal vostro servizio, è necessario utilizzare FormFactoryInterface::create() invece di FormFactoryInterface::createBuilder()

Il motivo per cui $this->createForm() opere in controller è perché ogni controller sta estendendo la base controller, che succede ad implementare questo metodo.

Ho trovato la capacità del mio IDE di collegarsi a file Symfony specifici altamente utili e ti suggerisco di usarne uno, se non lo sei già. C'è anche un repository git, che puoi trovare here.

Problemi correlati