首页 > 解决方案 > 当存在一些依赖错误时,如何停止在 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 节时,我在第二节中遇到错误。如果出现任何错误,我如何停止或逆转动作的发生

标签: phplaraveleloquentcontrollerrequest

解决方案


这是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永远无法达到逻辑。


推荐阅读