2016-04-27 9 views
3

Ich weiß, es gibt 2 andere Fragen darüber, aber ich denke, keiner von ihnen löst, was ich fragen werde.Definieren Sie Formular als Service in Symfony 3.0

In Symfony 2.8 gibt es eine Verwarnungsnotiz zum Markieren eines als Service definierten Formulars mit einem "Alias", mit dem man an "createForm" übergeben kann, um das Formular zu erhalten.

Also bitte korrigieren Sie mich, wenn ich falsch bin, jetzt müssen wir den Dienst ohne Alias-Tag definieren:

#src/MyBundle/Resources/config/services.yml 
my.form.as.service: 
    class: MyBundle\Form\Type\MyFormType 
    arguments: ["@doctrine.orm.entity_manager",%myparameter1%] 
    tags: { - name: form.type } 

Und in der Steuerung:

$form = $this->createForm('my.form.as.service'); 

Aber das gibt mir eine Formular-Benennungsfehler, da das Formular 'my_name' in der getName-Funktion zurückgibt und erwartet, dass das Formular FQCN empfängt. OK, nach anderen Antworten hier in der Steuerung geändert ich:

use MyBundle\Form\Type\MyFormType; 
... 
$form = $this->createForm(MyFormType::class) 

das, und in Github symfony Mitgliedern sagt, dass Formularkomponente macht die ganze Arbeit funktioniert ... aber was ist, wenn ich will einen seccond Dienst mit dem definieren gleiche Klasse, aber mit einem anderen Parameter anstelle von% Parameter1%. In 2.8 und älter war ich in der Lage, einen anderen Dienst zu definieren und seinen Namen an die createForm-Funktion zu übergeben, aber jetzt, wo er die Klasse direkt bekommt, kann ich das tun? (Ich weiß, dass es komisch oder unnötig sein kann oder ...).

Und zu Symfony-Mitgliedern: Ich bin mit Javiereguiluz, dass diese Änderung Sie mehr Code schreiben macht und Sie nicht die vollständige Kontrolle darüber haben, wie die Formularkomponente Ihren Dienst verwendet. War es so notwendig, den Alias ​​zu entfernen, um unser Leben so kompliziert zu machen? Vielen Dank!

Antwort

3

Entschuldigung, ich habe Ihre Frage zuerst falsch gelesen. Nun die richtige Antwort:

Wenn Ihr Formulartyp eine dynamische Konfigurationseinstellung (z. B. einen Parameter) haben muss, sollte stattdessen eine Formulartypoption erstellt werden. Dies ermöglicht es, dynamisch diese Einstellung zu ändern:

class MyFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $form, array $options) 
    { 
     $options['your_setting']; // read the option 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setRequired('your_setting'); // add a required option 
    } 
} 

Verbrauch:

$this->createForm(MyFormType::class, null, [ 
    'your_setting' => 'some value', 
]); 

Alternativ können Sie auch die Einstellung zu einem gewissen statischen Wert Default oder auf einen Parameter:

class MyFormType extends AbstractType 
{ 
    private $yourSetting; 

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

    // ... 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefault('your_setting', $this->yourSetting); 
    } 
} 

Sie können Lesen Sie mehr dazu in der OptionsResolver component documentation.

+0

Dank Wouter, sagte ich einen Parameter, etwas zu sagen, aber was ist, wenn ich will, ist es, einen anderen Dienst zu injizieren? Vor 3.0 war ich in der Lage, 2 Formular-Dienste zu definieren, jede mit dem Dienst, der benötigt wurde, aber jetzt ... Ist das Erstellen von 2 Klassen für die gleiche Form die einzige Option?Wenn ja, ich denke, sie haben nicht so viel über dieses Update nachgedacht ... –

+1

@JordiPuig Ich kann dir eine Sache versprechen, das Kernteam macht keine so großen Veränderungen, ohne alle Vor- und Nachteile abzuwägen. Haben Sie einen echten Anwendungsfall für verschiedene Dienste, die in denselben Formulartyp injiziert werden? (Ich denke, Ihr Formular-Typ macht in solchen Fällen zu viel und Sie brauchen andere Dinge, wie Datentransformatoren/Mapper oder Formularereignis Listener) –

+0

Momentan habe ich es nicht, aber ich bin mir ziemlich sicher, dass es passieren kann. Ich habe in symfony github viele Diskussionen darüber gesehen, und von meiner täglichen Arbeit kann ich bei dieser Änderung keinen Vorteil finden, aber eine Menge Code neu schreiben müssen ... Ich wollte nur wissen, ob es wirklich das System verbessert oder es war nur um "ein paar Zeilen Code" und aviod Namensfehler zu verdienen. Danke trotzdem für die Antwort. –

0

fragte ich die gleiche Frage und beantwortet mich hier: Symfony 2.8/3.0 upgrade: how to deal with form types with variable parameters?

Leider ist dies eine Einschränkung in Symfony 3.0 und es gibt keine Lösung dafür.

Eine Lösung besteht darin, für jede Form eine Klasse zu erstellen (statt einer gemeinsamen) und jede davon eine gemeinsame abstrakte Klasse zu erstellen, um Code-Duplizierung zu vermeiden.

Aber das erfordert immer noch, dass Sie viele Klassen erstellen, was nicht optimal ist.

Verwandte Themen