我们可以使用Symfony表单组件中的Data Transformers来解决此问题,将从表单中收集的数据转换为对应的实体对象。以下是一个例子:
use Symfony\Component\Form\DataTransformerInterface;
class EntityToIdTransformer implements DataTransformerInterface
{
private $entityManager;
private $entityClass;
public function __construct(EntityManagerInterface $entityManager, string $entityClass)
{
$this->entityManager = $entityManager;
$this->entityClass = $entityClass;
}
public function transform($value)
{
if (null === $value) {
return '';
}
return $value->getId();
}
public function reverseTransform($id)
{
if (!$id) {
return null;
}
return $this->entityManager->getRepository($this->entityClass)->find($id);
}
}
此转换器将一个实体转换为其ID,以便在表单中进行显示,然后通过ID将其转换回实体。我们可以将其与表单中的字段关联:
$builder->add('user', EntityType::class, [
//...
'choice_label' => function ($user) {
return $user->getFullName();
},
'class' => User::class,
'required' => true,
'attr' => [
'class' => 'select2'
],
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.fullName', 'ASC');
],
'choice_attr' => function ($user) {
return [
'data-email' => $user->getEmail(),
'data-phone' => $user->getPhone(),
];
},
'choice_value' => 'id',
'choice_loader' => function ($entityClass) use ($entityManager) {
return new EntityLoader($entityManager, $entityClass);
},
'choice_translation_domain' => false,
'data_class' => null,
'empty_data' => '',
'empty_value' => '',
'error_bubbling' => true,
'invalid_message' => '',