Ich möchte eine Formularklasse zu Symfony2.8 (und später zu Symfony3) aktualisieren. Jetzt wird das Formular konvertiert mit Ausnahme eines Attributs, choice_list
, das nicht mehr unterstützt wird. Und ich weiß nicht, wie ich das machen soll.Update Form mit 'Choice_list' zu Symfony> = 2.8
Ich habe das folgende Formular Typ, der auch als Service definiert ist:
class ExampleType extends AbstractType
{
/** @var Delegate */
private $delegate;
public function __construct(Delegate $delegate)
{
$this->delegate = $delegate;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('list', ChoiceType::class, array(
'choice_list' => new ExampleChoiceList($this->delegate),
'required'=>false)
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'ExampleClass',
));
}
}
Und ich habe die folgende Klasse für die Auswahlliste:
class ExampleChoiceList extends LazyChoiceList
{
/** @var Delegate */
private $delegate;
public function __construct(Delegate $delegate)
{
$this->delegate = $delegate;
}
/**
* Loads the choice list
* Should be implemented by child classes.
*
* @return ChoiceListInterface The loaded choice list
*/
protected function loadChoiceList()
{
$persons = $this->delegate->getAllPersonsFromDatabase();
$personsList = array();
foreach ($persons as $person) {
$id = $person->getId();
$personsList[$id] = (string) $person->getLastname().', '.$person->getFirstname();
}
return new ArrayChoiceList($personsList);
}
}
Die Klasse ExampleChoiceList die Auswahlliste generieren wie ich es haben will, und bis jetzt hat es funktioniert. Aber das Attribut choice_list
wird nicht mehr unterstützt, und meine Frage lautet: "Wie bekomme ich diese Konvertierung ohne zu viel Arbeit?". Ich lese, dass ich einfach choice
verwenden sollte, aber wie bekomme ich das, was ich will (das spezifische Label aus der Datenbank) in Symfony 2.8. Ich hoffe, dass mir jemand helfen kann.
Vielen Dank für Ihre Hilfe. Ich generiere nicht für jeden Typ einen Service, ich habe '' choice_loader '=> new ExampleChoiceLoader ($ this-> delegate), 'now. Und ich schreibe eine Klasse für alle meine Fälle, die erweitert werden, so dass ich nur die Methode 'loadChoiceList' implementieren muss. Ich habe den Fall, dass ich 10 Auswahlliste von verschiedenen Typen habe (und ich möchte Dienste für alle verwenden), als ich auch für jeden der Lader implementieren und sie alle im Konstruktor setzen muss? Denn in diesem Fall erscheint es nur für die Wahllisten ein wenig überdimensioniert. – Mirar
Wenn Sie einen Formulartyp als Dienst deklarieren, können Sie den FQCN wie gewohnt verwenden. Die Injektion wird von [DependencyInjectionExtension'] (https://github.com/symfony/symfony/blob/master/src/) verarbeitet. Symfony/Komponente/Formular/Erweiterung/DependencyInjection/DependencyInjectionExtension.php). Sie müssen also keine konstruierte Instanz des Formulartyps übergeben. – Heah
So würde es nur eine Lader-Instanz in allen Ihren Typen verwenden. Vielleicht könnten Sie einen abstrakten Typ erstellen, den alle Typen, die den Loader benötigen, erweitern können. – Heah