Laravel 8中如何将JSON编码数组展示在SweetAlert弹窗中
问题背景
我当前使用Laravel 8框架搭配Sweet Alert扩展包,希望将Exception异常捕获到的错误信息通过Sweet Alert错误弹窗进行展示。
初始控制器方法逻辑如下:
try{ ... }catch(\Exception $e){ // Alert::error('Error Title', 'Error Message'); return json_encode(['status' => '500', 'msg' => __('message.error-server')]); }
我将错误信息存入关联数组后做了JSON编码,但不需要直接返回该JSON响应,而是要调用Alert::error(...)方法把对应信息渲染成弹窗提示,需要实现该效果。
调试过程
第一次测试(未弹出错误提示)
测试代码如下,运行后没有弹出对应错误Alert:
public function destroy(User $user) { try{ $useradasd->is_active = 0; $useradasd->is_deleted = 1; $useradasd->remover_id = Auth::id(); $useradasd->save(); }catch(\Exception $e){ $attributes = ['status' => '500', 'msg' => __('message.error-server')]; $dataAttributes = array_map(function($value, $key) { return $key.'=>'.$value; }, array_values($attributes), array_keys($attributes)); $associativeString = implode(', ', $dataAttributes); Alert::error($associativeString); } Alert::success('Removed', 'That user is deleted'); return back(); }
第二次测试(异常未捕获,弹出成功提示)
调整写法传入错误标题参数后,异常没有被捕获,页面直接弹出Alert::success(...)对应的成功提示:
public function destroy(User $user) { try{ $useradasd->is_active = 0; $useradasd->is_deleted = 1; $useradasd->remover_id = Auth::id(); $useradasd->save(); }catch(\Exception $e){ $attributes = ['status' => '500', 'msg' => __('message.error-server')]; $dataAttributes = array_map(function($value, $key) { return $key.'=>'.$value; }, array_values($attributes), array_keys($attributes)); $associativeString = implode(', ', $dataAttributes); Alert::error('Error',$associativeString); } Alert::success('Removed', 'That user is deleted'); return back(); }
当前进度
目前已经可以成功触发错误弹窗,效果如下:
需要实现的效果是:把$attributes['status']的值(即500)作为错误弹窗的标题,$attributes['msg']作为弹窗正文内容。
解决方案
之前的写法存在两个核心问题:
- catch块执行完没有终止后续逻辑,无论是否触发异常,catch块外的
Alert::success()都会执行,直接覆盖掉错误提示 - 不需要手动把数组拼接成字符串,
Alert::error()原生支持两个参数,第一个参数对应弹窗标题,第二个参数对应弹窗正文,直接传入对应字段即可
修正后的完整代码如下:
public function destroy(User $user) { try{ // 注意替换测试时写的未定义变量$useradasd为正确的模型实例 $user->is_active = 0; $user->is_deleted = 1; $user->remover_id = Auth::id(); $user->save(); // 成功提示移入try块,仅业务无异常时触发 Alert::success('Removed', 'That user is deleted'); }catch(\Exception $e){ $attributes = ['status' => '500', 'msg' => __('message.error-server')]; // 直接按参数顺序传入标题、正文即可 Alert::error((string)$attributes['status'], $attributes['msg']); } return back(); }
关键调整点:
- 成功提示逻辑移入try块内部,只有业务逻辑正常执行完成才会弹出成功提示
- catch块内直接读取
$attributes数组的对应字段传参,不需要做额外的数组拼接操作 - 不需要额外return JSON响应,所有弹窗配置完成后统一执行
return back()即可,SweetAlert会自动读取闪存的提示信息渲染到页面 - 开发环境调试时如果需要展示真实报错,可以把第二个参数替换为
$e->getMessage(),生产环境建议保留通用错误提示,避免泄露服务器敏感信息
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

