Symfony 3 数据转换器报错求助:构造函数参数缺失
解决Symfony 3数据转换器注入错误的方案
兄弟,太懂这种卡一周的滋味了!你遇到的这个错误本质就是依赖注入没做好——你的SearchType构造函数明确要求传入DepartementTransformer实例,但你创建表单的时候没正确传递这个依赖,或者没通过Symfony的服务容器来管理这些类的实例化。咱们一步步来解决:
1. 先确认SearchType的构造函数声明正确
首先检查你的SearchType类,确保它的构造函数确实正确接收了转换器依赖,比如:
namespace ExellBundle\Form\Type; use ExellBundle\Form\DataTransfomer\DepartementTransformer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type\TextType; class SearchType extends AbstractType { private $departementTransformer; // 构造函数明确要求传入转换器实例 public function __construct(DepartementTransformer $transformer) { $this->departementTransformer = $transformer; } public function buildForm(FormBuilderInterface $builder, array $options) { // 别忘了在表单字段上添加转换器 $builder->add('departement', TextType::class); $builder->get('departement')->addModelTransformer($this->departementTransformer); // 其他表单配置... } // 定义表单块前缀(Symfony 3必填) public function getBlockPrefix() { return 'exell_search'; } }
2. 注册转换器和表单类型为服务
Symfony 3中,带有依赖的表单类型不能直接new出来,必须通过服务容器管理。你需要在服务配置文件(比如app/config/services.yml或者你的Bundle下的Resources/config/services.yml)里注册两个服务:
2.1 注册DepartementTransformer服务
services: # 注册数据转换器服务 exell.form.transformer.departement: class: ExellBundle\Form\DataTransfomer\DepartementTransformer # 如果你的转换器需要其他依赖(比如EntityManager),在这里注入: # arguments: ['@doctrine.orm.entity_manager']
2.2 注册SearchType服务并注入转换器
# 注册表单类型服务,注入上面的转换器 exell.form.type.search: class: ExellBundle\Form\Type\SearchType arguments: ['@exell.form.transformer.departement'] tags: - { name: form.type } # 这个标签告诉Symfony这是一个表单类型服务
3. 正确在控制器中创建表单
最后一步,确保你在控制器里不是直接new SearchType(),而是通过Symfony的服务容器来获取表单类型:
// 错误写法:直接实例化,不会自动注入依赖 // $form = $this->createForm(new SearchType(), $yourData); // 正确写法1:使用服务ID $form = $this->createForm('exell.form.type.search', $yourData); // 正确写法2(Symfony 3.3+支持):直接使用类名(Symfony会自动从服务容器查找) $form = $this->createForm(SearchType::class, $yourData);
做完这些步骤,那个构造函数参数缺失的错误应该就消失了。如果之后还有转换器逻辑的问题,再检查transform和reverseTransform方法的实现是否符合要求——比如transform要把实体转成前端可展示的字符串,reverseTransform要把用户输入的字符串转回对应的Departement实体。
内容的提问来源于stack exchange,提问作者Maxime Bordas
相关产品推荐
相关产品推荐

