PHP if else语句哪里出错?无法返回toast错误提示
问题根因
- 校验流程触发断层
Laravel 内置的$request->validate()方法,只要匹配到不满足的校验规则,会直接中断后续代码执行,自动重定向回上一页。这是框架的默认行为,你写在后面的错误Toast提示、数据库插入逻辑根本不会被运行到。 - 数据库插入返回值判断失效
Laravel查询构造器的insert()方法,执行成功时返回受影响的行数(单条插入固定返回1),执行失败时直接抛出数据库层面的异常,不会返回false。你写的if ($save)判断,只要不触发数据库报错,永远会走成功分支,代码里的else块从来没有被触发的可能。
修正后的可运行代码
public function store(Request $request) { // 定义校验规则 $rules = [ 'category_name' => 'required|unique:categories|max:50', ]; // 手动执行校验,不触发框架自动中断的重定向流程 $validator = \Validator::make($request->all(), $rules); if ($validator->fails()) { // 校验不通过,手动触发错误Toast Toastr::error('输入内容不符合要求,请检查分类名称是否为空、重复或超长', '操作失败'); return redirect()->route('admin.category')->withErrors($validator)->withInput(); } try { $data = [ 'category_name' => $request->category_name ]; DB::table('categories')->insert($data); Toastr::success('分类信息保存成功', '操作成功'); return redirect()->route('admin.category'); } catch (\Exception $e) { // 捕获数据库执行异常,触发错误Toast Toastr::error('分类信息保存失败,请稍后重试', '操作失败'); return redirect()->route('admin.category'); } }
补充说明
- 原代码中所有能触发错误Toast的场景(校验不通过、插入失败),都因为框架默认逻辑和方法返回值特性,完全没有走到对应分支的路径,自然只有插入成功时能正常弹出提示。
- 如果不想在每个控制器方法里重复编写校验失败的Toast逻辑,可以在前端布局模板中读取
session携带的校验错误信息,自动渲染对应的错误Toast提示。
内容的提问来源于stack exchange,提问作者Serdar Kavrazlı
相关产品推荐
相关产品推荐

