Symfony4嵌套表单中如何向Transformers传递EntityManager
解决Symfony 4.0嵌套表单Transformer传递EntityManager的问题
嘿,作为折腾过不少Symfony表单的开发者,帮你捋捋怎么搞定这个问题——毕竟我刚帮几个新手踩过类似的坑😉
方法一:给嵌套表单类型构造函数注入EntityManager
这是最贴合Symfony依赖注入理念的方式,直接把EntityManager传给你的嵌套表单类型:
- 先在嵌套表单类里注入
EntityManagerInterface:
use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Form\AbstractType; class PersonNestedType extends AbstractType { private $entityManager; // 通过构造函数注入EntityManager public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } public function buildForm(FormBuilderInterface $builder, array $options) { // 创建Transformer时直接传入已注入的EntityManager $builder->add('related_field', TextType::class, [ 'model_transformer' => new YourCustomTransformer($this->entityManager) ]); // 其他表单字段配置... } }
- 确保在
services.yaml里把表单类型注册为服务(Symfony 4.0下src/Form目录的类可能自动注册,但手动写更稳妥):
services: App\Form\PersonNestedType: arguments: ['@doctrine.orm.entity_manager'] tags: ['form.type']
方法二:借助表单事件动态获取EntityManager
如果不想给表单类型加构造函数,也可以通过表单事件从容器里拿到EntityManager:
use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { $form = $event->getForm(); // 从表单工厂的容器里取出EntityManager $entityManager = $form->getConfig()->getFormFactory()->getContainer()->get('doctrine.orm.entity_manager'); // 给字段绑定带EntityManager的Transformer $form->add('your_target_field', TextType::class, [ 'model_transformer' => new YourCustomTransformer($entityManager) ]); });
这种方式适合临时场景,不过要注意:Symfony后续版本对容器获取服务的方式有调整,但4.0里这么用完全没问题。
方法三:把Transformer本身注册为服务
让Transformer自己依赖注入EntityManager,表单里直接用这个服务就行,代码更整洁:
- 先给Transformer类注入EntityManager:
use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Form\DataTransformerInterface; class YourCustomTransformer implements DataTransformerInterface { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } // 实现transform()和reverseTransform()方法,直接用$this->entityManager操作数据库 public function transform($value) { // 你的转换逻辑... } public function reverseTransform($value) { // 反向转换逻辑... } }
- 在
services.yaml里注册Transformer服务:
services: App\Form\DataTransformer\YourCustomTransformer: arguments: ['@doctrine.orm.entity_manager']
- 最后在表单类型里注入这个Transformer服务,直接使用:
class PersonNestedType extends AbstractType { private $customTransformer; public function __construct(YourCustomTransformer $customTransformer) { $this->customTransformer = $customTransformer; } public function buildForm(FormBuilderInterface $builder, array $options) { $builder->addModelTransformer($this->customTransformer); // 其他字段配置... } }
另外提一句:Symfony 4.0确实有点年头了,如果后续有升级计划,这些方法在5+版本里也适用,只是服务注册会更简化~
内容的提问来源于stack exchange,提问作者Heinrich Stoellinger
相关产品推荐
相关产品推荐

