Symfony3中session参数address['livraison']为空,无法获取地址求助
问题分析与解决方案
嘿,我一眼就揪出了导致你session['address']['livraison']为null的核心问题——拼写错误!除此之外,还有几个小细节可以优化,下面一步步给你拆解:
1. 致命拼写错误(直接导致null的原因)
在setLivraisonOnSession方法中,你获取表单参数时把livraison拼成了livrasion(少了一个字母a):
// 错误代码 $adresse['livraison'] = $request->request->get('livrasion');
表单里的radio控件name明明是livraison,但你用错误的键去取值,自然拿不到有效数据,所以adresse['livraison']一直是null。
修正后应该是:
$adresse['livraison'] = $request->request->get('livraison');
2. 补充优化建议
除了拼写错误,还有几个小地方可以调整,避免后续踩坑:
- 参数检查逻辑优化:当前代码如果
livraison或facturation参数为空就直接redirect,建议添加Flash错误提示,让用户知道哪里出了问题 - session初始化的严谨性:用null合并运算符简化初始化逻辑,避免空数组判断的冗余代码
- 空值防护:在查询地址时增加空值判断,避免调用
find(null)引发报错
修正后的完整控制器代码
public function setLivraisonOnSession(Request $request) { $session = $request->getSession(); // 简化session初始化:如果没有'adresse'就返回空数组 $adresse = $session->get('adresse', []); $livraisonId = $request->request->get('livraison'); $facturationId = $request->request->get('facturation'); // 检查两个参数是否都存在 if($livraisonId !== null && $facturationId !== null ) { $adresse['livraison'] = $livraisonId; $adresse['facturation'] = $facturationId; $session->set('adresse',$adresse); } else { // 添加错误提示,让用户明确知道问题 $this->addFlash('error', 'Veuillez sélectionner une adresse de livraison et de facturation'); } return $this->redirect($this->generateUrl('validation')); } public function validationAction(Request $request) { if($request->isMethod('POST')) { $this->setLivraisonOnSession($request); } $em = $this->getDoctrine()->getManager(); $session = $request->getSession(); $adresse = $session->get('adresse', []); // 调试用:打印session内容,确认数据是否正确(开发阶段使用) // dump($adresse); $produits = $em->getRepository('EcommerceBundle:Produits')->findArray(array_keys($session->get('panier', []))); // 增加空值判断,避免调用find(null)报错 $livraison = isset($adresse['livraison']) ? $em->getRepository('EcommerceBundle:UtilisateursAdresses')->find($adresse['livraison']) : null; $facturation = isset($adresse['facturation']) ? $em->getRepository('EcommerceBundle:UtilisateursAdresses')->find($adresse['facturation']) : null; return $this->render('EcommerceBundle:Default/panier/layout:validation.html.twig',array( 'produits' => $produits, 'livraison'=>$livraison, 'facturation'=>$facturation, 'panier'=>$session->get('panier', []) )); }
额外调试技巧
- 在表单提交后,用
dump($request->request)查看是否正确接收到livraison和facturation参数 - 用
dump($session->get('adresse'))确认session里的地址数据是否被正确存储
内容的提问来源于stack exchange,提问作者ferdinand
相关产品推荐
相关产品推荐

