繁体   English   中英

如何在Symfony2表单类型中使用已解析的目标实体?

[英]How to use a resolved target entity in a Symfony2 form type?

src / AppBundle / Entity / ShoppingCart / Order.php可以解析OrderInterface ,并且可以在Doctrine上正常工作。

如果尝试以'class' => OrderInterface::class形式使用它,则会收到错误消息:

Class "ShoppingCartBundle\\Entity\\OrderInterface" seems not to be a managed Doctrine entity. Did you forget to map it?"

当然可以直接定义'class' => Order::class ,但是那样就失去了解析目标实体配置的优势。

src / ComplaintsBundle / Form / Type / ComplaintType.php

...
public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder
        ->add('order', EntityType::class,
            array(
                'required'    => true,
                'class'       => OrderInterface::class,
                'property'    => 'id',
            )
        );
}
...

app / config / config.yml

orm:
    auto_generate_proxy_classes: %kernel.debug%
    auto_mapping: true
    resolve_target_entities:
        ShoppingCartBundle\Entity\OrderInterface: AppBundle\Entity\ShoppingCart\Order

注入doctrine.dbal.connection.event_manager在这个表单evmEntityManager作为em

之后,您可以尝试如下操作:

private function resolveClass(string $className): string
{
    $eventArgs = new OnClassMetadataNotFoundEventArgs($className, $this->em);
    $this->evm->dispatchEvent(Events::onClassMetadataNotFound, $eventArgs);

    $metadata = $eventArgs->getFoundMetadata();
    if ($metadata === null) {
        throw new InvalidArgumentException("Failed to resolve class $className");
    }

    return $metadata->getName();
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
   $builder
        ->add('order', EntityType::class,
            array(
                'required'    => true,
                'class'       => $this->resolveClass(OrderInterface::class),
                'property'    => 'id',
            )
        );
}

我实际上并没有对此进行测试,只是看了Doctrine如何做到这一点

实类名称在元数据加载期间解析。 为了通过接口获取真实的类名,应该触发元数据加载。 这可以用下一个代码来实现

$entityManager = $managerRegistry->getManager();
$metadata = $entityManager->getClassMetadata(OrderInterface::class);
$realClassName = $metadata->getName();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM