Как использовать разрешенную целевую сущность в типе формы Symfony2?

php symfony doctrine-orm

621 просмотра

2 ответа

49 Репутация автора

Есть src/AppBundle/Entity/ShoppingCart/Order.phpрешение, OrderInterfaceи оно прекрасно работает с Доктриной.

Если попытаться использовать его в форме, '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
Автор: Serhii Vasko Источник Размещён: 18.07.2016 04:34

Ответы (2)


0 плюса

1322 Репутация автора

Внедрить doctrine.dbal.connection.event_managerв вашу форму, как evmи EntityManagerкак 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',
            )
        );
}

Я на самом деле не проверял это, просто смотрел, как это делает Доктрина .

Автор: Konstantin Pereiaslov Размещён: 18.07.2016 05:14

0 плюса

1 Репутация автора

Настоящее имя класса разрешается во время загрузки метаданных. Для получения реального имени класса по интерфейсу должна быть запущена загрузка метаданных. Это может быть достигнуто с помощью следующего кода

$entityManager = $managerRegistry->getManager();
$metadata = $entityManager->getClassMetadata(OrderInterface::class);
$realClassName = $metadata->getName();
Автор: Dmitrii Khrysev Размещён: 14.11.2016 03:27
Вопросы из категории :
32x32