2011-11-12 23 views
24

lo que me gustaría ser capaz de hacer desde cualquier controlador es:Crear un formulario como un servicio en Symfony2

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

Y en mi plantilla

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

Así es como he puesto hasta ahora

En mi Acme/UserBundle/Resources/config/services.yml que tienen

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

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

En RegisterManager.php tengo

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

Y en Acme\UserBundle\Form\Type\RegistrationType tengo:

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

sé los RegistrationType() obras que yo he tenido en un controlador. Mi problema es configurar RegisterManager como un servicio, no puedo obtener los componentes correctos allí y no estoy seguro de dónde buscar.

+0

¿Cuál es exactamente el problema que está encontrando? ¿A qué te refieres con "no se pueden obtener los componentes correctos allí"? En este momento, debería funcionar como se esperaba. – gilden

+0

ahora mismo, en mi servicio RegistrationManager necesito poder llamar '' 'createForm (new RegistrationType())' '' y devolverlo para que el controlador pueda pasarlo a la plantilla, pero no estoy seguro de dónde '' 'createForm()' '' está definido y cómo hacer que esté disponible en esta clase de servicio. En la documentación de Symfony Forms se accede como '' '$ this-> createForm()' '' pero ¿cómo haré eso en mi clase de servicio? No creo que forme parte de '' 'FormFactoryInterface''' http://symfony.com/doc/current/book/forms.html#creating-form-classes – ed209

+0

FOSUserBundle utiliza el servicio form.factory directamente sin el necesita una clase de RegisterManager, compruébelo, https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/profile.xml – solarc

Respuesta

19

Parece que ya casi está allí. Para obtener un objeto formulario de su servicio, se debe utilizar en lugar de FormFactoryInterface::create()FormFactoryInterface::createBuilder()

La razón por la $this->createForm() obras en los controladores se debe a que cada controlador está extendiendo el base controller, que pasa a implementar este método.

He encontrado la capacidad de mi IDE para vincular a archivos Symfony específicos de gran ayuda y le sugiero que utilice uno, si es que ya no lo es. También hay un repositorio git, que puedes encontrar en here.

Cuestiones relacionadas