Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
390 views
in Technique[技术] by (71.8m points)

php - Create a form as a service in Symfony2

What I'd like to be able to do from any controller is:

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

And in my template

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

Here's how I have set up so far

In my Acme/UserBundle/Resources/config/services.yml I have

parameters:
    register_manager.class: AcmeUserBundleManagerRegisterManager

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

In RegisterManager.php I have

namespace AcmeUserBundleManager;

use AcmeUserBundleFormTypeRegistrationType;
use SymfonyComponentFormFormFactoryInterface;

class RegisterManager
{

    protected $formFactory;

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


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

And in AcmeUserBundleFormTypeRegistrationType I have:

namespace AcmeUserBundleFormType;

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilder;

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' => 'AcmeUserBundleEntityUser',
        );
    }

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

I know the RegistrationType() works as I've had it in a controller. My problem is with setting up RegisterManager as a service, I can't get the right components in there and I'm not sure where to look.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You're almost there, it seems. To get a Form object from your service, you should use FormFactoryInterface::create() instead of FormFactoryInterface::createBuilder()

The reason why $this->createForm() works in controllers is because every controller is extending the base controller, which happens to implement this method.

I have found my IDE's ability to link to specific Symfony files highly helpful and I suggest you use one, if you already aren't. There's also a git repository, which you can find here.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...