Laravel PHP实现:将最近3个商品加入对比并从会话获取展示
Laravel商品对比页面:从Session获取最近3个商品的代码优化
需求:在Laravel PHP项目的商品对比页面中,从Session获取最近添加的3个商品用于展示,以下是原始实现代码:
class CompareController extends Controller { public function index(Request $request) { if (App::isLocale('en')) { $language_id = 1; }else{ $language_id = 4; } $data = $request->products_id; $arr = Session::get('success'); if( in_array( $data, $arr , TRUE )){ return $arr ; }else{ Session::push('success',$data); } if(count($arr) > 3){ array_shift($arr); } $product = DB::table('products') ->leftJoin('products_description','products_description.products_id','=','products.products_id') ->leftJoin('products_description','products_description.products_id','=','products.products_id') ->where('products_description.language_id','=', $language_id) ->whereIn('products.products_id', $arr ) ->get(); return view("website.layout.compare",compact('product')); } public function addToCompare(Request $request){ } }
代码存在的问题
- 语言ID判断逻辑冗余,可简化
- Session键名
success语义模糊,换成compared_products更直观 $arr = Session::get('success')可能返回null,直接用in_array会报错,需先初始化空数组- 检查到商品已存在时直接
return $arr,会中断视图渲染,应该跳过添加逻辑继续执行 - 修改
$arr数组后未同步更新Session,导致Session内容无变化 - DB查询重复关联
products_description表,属于无效操作 - 处理商品数量超过3个的逻辑顺序错误,应该在添加商品之后执行,否则新添加后总数会超过限制
修正后的代码
class CompareController extends Controller { public function index(Request $request) { // 简化语言ID判断 $language_id = App::isLocale('en') ? 1 : 4; $productId = $request->products_id; // 初始化Session数组,避免null报错 $comparedProducts = Session::get('compared_products', []); if ($productId) { // 商品不在列表中才添加 if (!in_array($productId, $comparedProducts, true)) { $comparedProducts[] = $productId; // 保持最多3个商品,超过则移除最早添加的 if (count($comparedProducts) > 3) { array_shift($comparedProducts); } // 更新Session Session::put('compared_products', $comparedProducts); } } // 查询商品数据,只关联一次描述表 $products = DB::table('products') ->leftJoin('products_description', 'products_description.products_id', '=', 'products.products_id') ->where('products_description.language_id', '=', $language_id) ->whereIn('products.products_id', $comparedProducts) ->get(); return view("website.layout.compare", compact('products')); } public function addToCompare(Request $request) { // 把添加逻辑独立出来,让index专注于页面渲染 $productId = $request->products_id; $comparedProducts = Session::get('compared_products', []); if ($productId && !in_array($productId, $comparedProducts, true)) { $comparedProducts[] = $productId; if (count($comparedProducts) > 3) { array_shift($comparedProducts); } Session::put('compared_products', $comparedProducts); } // 重定向回对比页面 return redirect()->route('compare.index'); } }
补充说明
- 将添加商品的逻辑拆分到
addToCompare方法,符合单一职责原则 - 变量命名更清晰,比如
$data改为$productId,$arr改为$comparedProducts,提升代码可读性 - 所有操作先判断
$productId是否存在,避免空值处理错误
内容的提问来源于stack exchange,提问作者Omar Selim
相关产品推荐
相关产品推荐

