最后,我找到了一个解决方案。
我将实体类型替换为简单的文本类型,然后创建了自己的DataTransformer类,以便将用户字符串id转换为真实的用户对象。
通过这种方式,用户对象被正确水合,而无需获取数千条记录,显著提高了加载速度。
以下就是我所做的:
我更改了:
class MyFormType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user', 'entity', array(
'required' => true,
'class' => 'User',
'property' => 'id',
))
;
}
}
收件人:
class MyFormType extends AbstractType{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('user', 'text', array(
'required' => true,
))
;
// we use a specific ModelTransformer (UserTransformer) created by ourself (see below)
$builder->get('user')->addModelTransformer(new UserTransformer($this->manager));
}
}
我创建了自己的UserTransformer类,如下所示:
class UserTransformer implements DataTransformerInterface
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
public function transform($user)
{
if (null === $user) {
return '';
}
return $user->getId();
}
public function reverseTransform($id)
{
if (!$id) {
return null;
}
$user= $this->manager
->getRepository(User::class)
->find($id)
;
if (null === $user) {
throw new TransformationFailedException(sprintf(
'There is no User with the id "%s" !',
$id
));
}
return $user;
}
}
最后,我将EntityManager传递给如下表单:
class MyRestController{
public function MyRestAction(...){
...
$myObject = new MyObject();
$manager = $this->getDoctrine()->getManager();
$myForm = $this->createForm(new MyFormType($manager), $myObject);
$myForm->handleRequest($request);
...
}
}
我在Symfony文档中找到了该解决方案:
https://symfony.com/doc/2.7/form/data_transformers.html
它工作得很好,现在我的应用程序速度快了10倍!