Расширить Doctrine2 форму EntityType

Я ищу способ расширить Symfony 2 EntityType

Symfony\Bridge\Doctrine\Form\Type\EntityType

как в новом типе, расширяющем этот, не создавая FormTypeExtension — и я не могу понять это. Кто-нибудь знает какой-нибудь правильный способ сделать это?

Я попытался просто расширить его таким образом:

class NestedEntityType extends EntityType {

public function getName() {
return $this->getBlockPrefix();
}

public function getBlockPrefix() {
return 'nested_entity';
}
}

а то в сонате админ класс у меня есть:

protected function configureFormFields(FormMapper $formMapper)
{
$formMapper->add('types', NestedEntityType::class, [
'label' => false,
'multiple' => true,
'expanded' => true,
'by_reference' => false
]);
}

но, к сожалению, это приводит к фатальной ошибке:

Исправляемая фатальная ошибка: аргумент 1 передан
Symfony \ Bridge \ Doctrine \ Form \ Type \ DoctrineType :: __ construct () должен
реализовать интерфейс Doctrine \ Common \ Persistence \ ManagerRegistry, нет
дано, вызвано в

Мне нужно сохранить всю функциональность EntityTypeс одним исключением — то, как он представлен. Вот почему мне нужно расширить этот тип (я использую его в других полях, поэтому я не могу просто изменить шаблон для него!).

я использую Symfony 2.8 (только для записи).

1

Решение

Таким образом, если вам нужно создать повторно используемое решение, для разных сущностей вам не понадобится configureOptions в этом случае.

Вам нужно создать elementType в вашем коде, как

$this->createForm(NestedEntityType::class, null, ['class' => YourEntity::class]);

И в этом случае вам нужно будет передать в качестве опции имя класса Entity, который является вложенным.

1

Другие решения

Вы не должны расширять его напрямую, а использовать parent вариант

/**
* {@inheritdoc}
*/
public function getParent()
{
return EntityType::class;
}

Так что-то вроде

class NestedEntityType extends AbstractType
{

public function getName()
{
return $this->getBlockPrefix();
}

public function getBlockPrefix()
{
return 'nested_entity';
}

/**
* {@inheritdoc}
*/
public function getParent()
{
return EntityType::class;
}
}

Таким образом, если в FormType, из которого вы расширяете, что-то вставлено (или установлено) в конструктор, вам не нужно заботиться о том, как Symfony сделает это за вас.

5

Если бы вы пошли в EntityTypeвы увидите, что он расширяется DoctrineType и нуждается в зависимостях в конструкторе —

public function __construct(ManagerRegistry $registry, PropertyAccessorInterface $propertyAccessor = null)
{
$this->registry = $registry;
$this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
}

Итак, ваш класс NestedEntityType использует тот же конструктор и нуждается в тех же зависимостях.

На самом деле, что вам нужно

class NestedEntityType extends AbstractType {

public function getParent() {
return EntityType::class;
}

public function getName() {
return $this->getBlockPrefix();
}

public function getBlockPrefix() {
return 'nested_entity';
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'class' => YourEntity::class
]);
}
}

UPD: конечно нужно настроить параметры, согласно EntityType doc. Смотрите метод, который я добавил в код.

1
По вопросам рекламы [email protected]