Symfony/Twig中基于角色渲染数据的问题排查
问题解决方法
核心问题:查询参数类型不匹配
你的代码中,findBy方法传递的rol参数是序列化后的字符串,但数据库中存储的是数组类型(表单选项值为数组),Doctrine查询数组字段时需要直接传入数组而非字符串,这就是查询不到数据的根本原因。
1. 修正控制器查询代码
将控制器里的字符串参数改为数组,同时修正重复的方法名:
/** * @Route("/leerling/mededelingen", name="app_leerling") */ public function showLeerling(MededelingenRepository $mededelingenRepository) { $mededelingen = $mededelingenRepository->findBy(["rol" => ["ROLE_LEERLING"]]); return $this->render('leerling/mededelingen.html.twig', ['mededelingen' => $mededelingen] ); } /** * @Route("/instructeur/mededelingen", name="app_instructeur") */ public function showInstructeur(MededelingenRepository $mededelingenRepository) { $mededelingen = $mededelingenRepository->findBy(["rol" => ["ROLE_INSTRUCTEUR"]]); return $this->render('instructeur/mededelingen.html.twig', ['mededelingen' => $mededelingen] ); }
2. 优化表单选项显示文本
表单选项的显示文本无需使用数组格式,改为更友好的名称:
$builder->add('rol', ChoiceType::class, [ 'choices' => [ '学生' => ["ROLE_LEERLING"], '讲师' => ["ROLE_INSTRUCTEUR"], ], ]);
3. 规范Twig模板变量名
循环变量使用单数形式更符合语义,避免混淆:
{% for mededeling in mededelingen %} <p>{{ mededeling.name }}</p> {% endfor %}
补充说明
当表单中设置choices的value为数组时,Doctrine的array字段类型会自动将数组序列化为字符串存储,但查询时必须传入原始数组——Doctrine会自动处理序列化匹配逻辑,手动传入序列化字符串会导致查询条件不匹配,无法返回数据。
内容的提问来源于stack exchange,提问作者ProDeveloper69
相关产品推荐
相关产品推荐

