Я ищу способ расширить 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 (только для записи).
Таким образом, если вам нужно создать повторно используемое решение, для разных сущностей вам не понадобится configureOptions в этом случае.
Вам нужно создать elementType в вашем коде, как
$this->createForm(NestedEntityType::class, null, ['class' => YourEntity::class]);
И в этом случае вам нужно будет передать в качестве опции имя класса Entity, который является вложенным.
Вы не должны расширять его напрямую, а использовать 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 сделает это за вас.
Если бы вы пошли в 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. Смотрите метод, который я добавил в код.