Symfony表单预填报错:数组无dest_ville键的问题咨询
问题解决步骤
错误原因
你当前的$info = $expeditionRepository->findAll();会返回所有Expedition实体的数组,而Twig模板里直接写info.dest_ville,相当于从数组中查找键为dest_ville的元素——但数组的键是数字索引(0、1、2...),自然找不到,所以报错。
你的需求是通过URL中的ID获取单条数据,其实已经写了$exp_mail = $entityManager->getRepository(Expedition::class)->findOneBy(['id' => $id]);,这就是你需要的单条数据,只是没正确利用。
解决方法
1. 修改Controller中的数据获取逻辑
把获取全部数据的代码替换为根据ID获取单条数据:
// 替换原来的$info = $expeditionRepository->findAll(); $info = $id ? $expeditionRepository->find($id) : new Expedition();
- 如果URL带ID(编辑场景),就从数据库取出对应实体;
- 如果ID为空(新增场景),就创建一个空的Expedition对象,兼容两种场景。
另外,你已经定义的$exp_mail变量和上面的$info功能重复,可以直接复用$exp_mail作为模板变量,避免重复查询。
2. 调整Twig模板的取值逻辑
现在info是单个实体对象,直接访问实体属性即可(注意:Symfony实体属性通常是驼峰命名,比如destVille,对应数据库的dest_ville字段,Doctrine会自动映射):
<div id="div_24"> <div class="align-inputs-dest"> <b>Nom :</b> <input type="text" id="24" class="input_list input_uppercase input_color" maxlength="35" name="dest_nom" value="{{ info.destVille ?? '' }}"> </div> </div>
- 加
?? ''是为了防止新增场景下info为空时出现报错,提供默认空值; - 如果你的实体属性确实是
dest_ville(非驼峰),则保持info.dest_ville即可。
3. 验证路由配置
确保你的路由支持ID参数,比如:
# config/routes.yaml app_expedition_newmodif: path: /expedition/newmodif/{id} controller: App\Controller\ExpeditionController::newmodif requirements: id: '\d+' defaults: id: null
这样编辑时URL会是/expedition/newmodif/123,ID会自动传入控制器的$id参数。
额外优化建议
推荐使用Symfony表单组件构建表单,自动处理数据预填、验证和提交逻辑,比手动写input更规范高效:
- 创建表单类型类
ExpeditionType.php; - 在Controller中初始化表单:
$form = $this->createForm(ExpeditionType::class, $info); $form->handleRequest($request);
- 在Twig中渲染表单:
{{ form_start(form) }} {{ form_widget(form) }} <button type="submit">保存</button> {{ form_end(form) }}
内容的提问来源于stack exchange,提问作者LayKoq
相关产品推荐
相关产品推荐

