Erstellen Sie ein Formular als Dienst in Symfony2

Lesezeit: 2 Minuten

Benutzer-Avatar
ed209

Was ich von jedem Controller aus tun möchte, ist:

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

Und in meiner Vorlage

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

So habe ich es bisher eingerichtet

In meinem Acme/UserBundle/Resources/config/services.yml Ich habe

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

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

Im RegisterManager.php Ich habe

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

Und in Acme\UserBundle\Form\Type\RegistrationType Ich habe:

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

Ich kenne die RegistrationType() funktioniert wie ich es in einem Controller hatte. Mein Problem ist die Einrichtung RegisterManager Als Service bekomme ich dort nicht die richtigen Komponenten und bin mir nicht sicher, wo ich suchen soll.

  • Was genau ist das Problem, auf das Sie stoßen? Was meinst du mit “kann nicht die richtigen Komponenten drin bekommen”? Im Moment sollte es wie erwartet funktionieren.

    – Kilden

    12. November 2011 um 21:42 Uhr

  • Im Moment muss ich in meinem RegistrationManager-Dienst anrufen können createForm(new RegistrationType()) und geben Sie das zurück, damit der Controller es an die Vorlage weitergeben kann, aber ich bin mir nicht sicher, wo createForm() definiert ist und wie es in dieser Serviceklasse verfügbar gemacht wird. In der Symfony Forms-Dokumentation wird darauf zugegriffen wie $this->createForm() aber wie würde ich das in meiner Serviceklasse machen? Ich glaube nicht, dass es ein Teil davon ist FormFactoryInterface symfony.com/doc/current/book/forms.html#creating-form-classes

    – ed209

    12. November 2011 um 22:13 Uhr

  • Das FOSUserBundle verwendet den form.factory-Dienst direkt, ohne dass eine RegisterManager-Klasse erforderlich ist. Probieren Sie es aus. github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/…

    – Solark

    3. Mai 2012 um 12:31 Uhr

  • Sehen Sie sich diesen Artikel an, der genau erklärt, wie Sie Ihr Formular als Dienst registrieren. webtipblog.com/define-a-symfony-2-form-as-a-service

    – Joe42

    18. Juni 2014 um 2:49 Uhr

Sie haben es fast geschafft, wie es scheint. Um ein Formularobjekt von Ihrem Dienst zu erhalten, sollten Sie verwenden FormFactoryInterface::create() Anstatt von FormFactoryInterface::createBuilder()

Der Grund warum $this->createForm() funktioniert in Controllern liegt daran, dass jeder Controller das erweitert Basis-Controllerdie diese Methode implementiert.

Ich fand die Fähigkeit meiner IDE, auf bestimmte Symfony-Dateien zu verlinken, sehr hilfreich, und ich schlage vor, dass Sie eine verwenden, falls Sie es noch nicht sind. Es gibt auch ein Git-Repository, das Sie finden können hier.

1054000cookie-checkErstellen Sie ein Formular als Dienst in Symfony2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy