Расширение базового вида формы BaseType в Symfony 4 - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу расширить форму BaseType, и вот что у меня так:

<?php

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\BaseType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\PropertyAccess\PropertyAccess;

class BaseTypeExtension extends AbstractTypeExtension
{
    public static function getExtendedTypes() : iterable
    {
        return [BaseType::class];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'icon' => null
        ]);
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {

        $view->vars['icon'] = $options['icon'];
    }
}

?>

Проблема в том, что когда я создал форму с параметром icon, она возвращаетошибка The option "icon" does not exist.

Дело в том, что расширение регистрируется, если я использую php bin/console debug:form, это показывает, что расширение существует примерно так:

Расширения типа

  • Приложение \ Форма \ Расширение \ BaseTypeExtension

Чего здесь не хватает?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

BaseType не может быть расширен, как указано в ответе @ Jakumi, хотя вам также не следует расширять AbstractType, если вы хотите повлиять на построитель форм.Вместо этого вы должны расширить FormType, который является базой для любого из входов, как указано здесь .

Итак, подведем итог, вот что мои FormTypeExtension обрисовали в общих чертах:

<?php

namespace App\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\PropertyAccess\PropertyAccess;

class FormTypeExtension extends AbstractTypeExtension
{
    public static function getExtendedTypes() : iterable
    {
        return [FormType::class];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'icon' => null
        ]);
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {

        $view->vars['icon'] = $options['icon'];
    }
}

?>

Это сработало, теперь я могу использовать расширение "icon" во входных данных моего конструктора форм.

1 голос
/ 22 сентября 2019

( обновление для тех, кого это касается: этот ответ, по-видимому, неверен)

Насколько я могу судить, все типы форм обычно расширяются AbstractType, а неBaseType.Я на самом деле не знаю, для чего BaseType, но, вероятно, для некоторых конкретных форм.

Так что вместо этого вы должны написать расширение для AbstractType, поскольку все расширяется AbstractType.В качестве примера расширения типа формы (возможно, следует путать с расширением формы):

TransformationFailureExtension

, которое также является расширением для AbstractType.

к тому же, с BaseType в исходном коде есть комментарий :

Этот тип не отображается в цепочке наследования типов формы и поэтому не можетбыть расширенным (через {@link \ Symfony \ Component \ Form \ FormExtensionInterface}) или тематическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...