php - 当存在一些依赖错误时,如何停止在 laravel 中执行创建操作
问题描述
我正在根据从用户详细信息表中获得的详细信息创建用户,
我的控制器
public function store(Request $request)
{
// Section 1
$user = User::create(
[
'name' => $request->input('first_name'),
'email' => $request->input('email'),
'row_status' => '1',
'user_type' => '3',
'password' => bcrypt('RandomPassword@123')
]
);
// Section 2
$technician_register = new Technician();
$technician_register->user_id = $user->id;
$technician_register->first_name = $request->input('first_name');
if ($request->hasFile('avatar_image')) {
$avatar_image = $request->file('avatar_image');
$extension = $avatar_image->getClientOriginalExtension();
$filename = $request->input('first_name') . date('Y-M-d') . '.' . Str::random(3) . "." . $extension;
$location = public_path('assets/images/technician_avatar/' . $filename);
Imag::make($avatar_image)->resize(300, 300)->save($location); // the Image is spelled wrong purposefully to replicate an error.
$technician_register->avatar_image = $filename;
}
$technician_register->save();
if ($technician_register) {
Session::flash('success', 'Selected record has been successfully saved');
return back();
} else {
$user_delete = User::findOrFail($user->id);
$user_delete->delete();
Session::flash('error', 'Error');
return back();
//This block doesn't seem to work!!
}
}
在执行第 1 节时,我在第二节中遇到错误。如果出现任何错误,我如何停止或逆转动作的发生
解决方案
这是transactions
非常方便的地方。您可以使用\DB::beginTransaction()
, 后跟\DB::rollback()
来阻止保存(如果出现问题),或\DB::commit()
完成保存(如果一切正常)。
基本示例是:
public function store(Request $request){
\DB::beginTransaction();
try {
$user = User::create(
[
'name' => $request->input('first_name'),
'email' => $request->input('email'),
'row_status' => '1',
'user_type' => '3',
'password' => bcrypt('RandomPassword@123')
]
);
$technician_register = new Technician();
$technician_register->user_id = $user->id;
$technician_register->first_name = $request->input('first_name');
if ($request->hasFile('avatar_image')) {
$avatar_image = $request->file('avatar_image');
$extension = $avatar_image->getClientOriginalExtension();
$filename = $request->input('first_name') . date('Y-M-d') . '.' . Str::random(3) . "." . $extension;
$location = public_path('assets/images/technician_avatar/' . $filename);
Image::make($avatar_image)->resize(300, 300)->save($location);
$technician_register->avatar_image = $filename;
}
$technician_register->save();
} catch (\Exception $ex){
\Log::error("Error in store(): ".$ex->getMessage());
\DB::rollBack();
Session::flash('error', 'Error');
return back();
}
\DB::commit();
Session::flash('success', 'Selected record has been successfully saved');
return back();
}
当您使用DB::beginTransaction
, 与try { ... } catch { ... }
块一起使用时,您可以尝试保存,并且在错误时(现在已正确捕获,以前不是),您可以防止数据被保存并防止“泥泞”数据(记录与无相关记录等)
编辑:你有这行代码:
Imag::make($avatar_image)->resize(300, 300)->save($location);
// the Image is spelled wrong purposefully to replicate an error.
但是如果没有try/catch
,那将产生一个未捕获的错误并停止执行,这意味着delete
永远无法达到逻辑。
推荐阅读
- javascript - 按 Tab 滚动到平面列表顶部
- javascript - js中的数据争吵:计算累积计数并在javascript中添加缺失的连续日期
- laravel - 运行 curl 命令创建新的 laravel 项目时 Docker 未运行
- reactjs - 未捕获的不变违规:需要查询选项。您必须在查询选项中指定您的 GraphQL 文档
- python - 调试配置中的 Python 路径无效
- excel - 使用 VBA 从 Excel 表下载 Google Drive 文件
- powershell - 数组中的Powershell变量
- python - Python - 在第一个数组达到 1900 个字符后,如何将数组拆分为多个数组?
- sapui5 - 使用 sap.ui.table 时是否有 updateFinished
- node.js - 未处理的拒绝(错误):引发了跨域错误。- ReactJs