2

我正在寻找一种扩展 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
    ]);
}

但不幸的是它会导致致命错误:

可捕获的致命错误:传递给 Symfony\Bridge\Doctrine\Form\Type\DoctrineType::__construct() 的参数 1 必须实现接口 Doctrine\Common\Persistence\ManagerRegistry,没有给出,调用

我需要保留 的全部功能EntityType,但有一个例外 - 它的呈现方式。这就是为什么我需要扩展这个类型(我在其他领域使用它,所以我不能只为它修改模板!)。

我正在使用Symfony 2.8(仅作记录)。

4

3 回答 3

9

您不应该直接扩展它,而是使用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 会为您做这件事。

于 2016-09-15T13:45:48.083 回答
1

因此,如果您需要为不同的实体创建可重用的解决方案,在这种情况下您不需要 configureOptions。

您需要在代码中创建一个 elementType,例如

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

在这种情况下,您需要将嵌套的类实体的名称作为选项传递。

于 2016-09-15T14:14:16.973 回答
1

如果你去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,您当然需要配置选项。请参阅我添加到代码中的方法。

于 2016-09-15T13:44:54.420 回答