php - 如何在 laravel 中从一个函数开始事务并在另一个函数中结束它

标签 php mysql laravel api

我有两个用于编辑配置文件 API 的函数:

1) 编辑个人资料 2) 验证密码

我需要使用验证 OTP 功能验证手机(如果更改)。为此,只有当 OTP 由用户提供时,我才需要提交我的更改(更新手机),否则我想回滚。所以,基本上我需要从 editProfile() 开始事务并以 verifyOtp() 结束。如何实现?请帮忙。

public function editProfile(Request $request)
    {
        $user = Auth::user();
        $Helper = new Helper;

        $validator = Validator::make($request->all(), 
        ['first_name' => 'required|alpha|string|max:255',
        'last_name' => 'required|alpha|string|max:255',
        'mobile' => 'required|digits:10|unique:users,mobile,'.$user->id,
        'user_image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2000'
         ]);


         if($validator->fails()) 
         {
           $error_array = (array)$validator->errors();
           $error_string =  $Helper->ModifyError($error_array);
           return response()->json(['ERROR'=>['MESSAGES'=>$error_string],'API_STATUS'=>'FAIL'], 200);            
         }

        $input = $request->all();
        if(isset($input['user_image']))
        {
            $user_upload_folder_path   = public_path('uploads/users/'.$user->id);
            if(!is_dir($user_upload_folder_path))
                {
                    mkdir($user_upload_folder_path);
                    chmod($user_upload_folder_path,0777);
                }

            $imageName = time().substr(pathinfo($request->user_image->getClientOriginalName(),PATHINFO_FILENAME),0,10).'.'.$request->user_image->getClientOriginalExtension();
            $request->user_image->move($user_upload_folder_path, $imageName);
            $input['user_image']=$imageName;
        }
        else
        {
            $input['user_image']='';
        }


        if($input['mobile']!=$user->mobile)
        {
            $input['otp']=(int)mt_rand(10000,99999);
            $message='Thanks for registering to zvesta. The verification OTP is '.$input['otp'];
            $this->send_sms($input['mobile'],$message); 
            $data=array(
            'first_name'=>$input['first_name'],
            'last_name'=>$input['last_name'],
            'mobile'=>$input['mobile'],
            'user_image'=>$input['user_image']);
            $data=json_encode($data);
            User::whereId($user->id)->update(['otp'=>$input['otp']]);
            DB::table('temporary')->
            insert([
                'user_id'=>Auth::id(),
                'data'=>$data
            ]);
            $success['mobile_verified']=0;

        }
        else
        {
            $user = User::whereId($user->id)->update([
            'first_name'=>$input['first_name'],
            'last_name'=>$input['last_name'],
            'user_image'=>$input['user_image']
            ]);
            $success['mobile_verified']=1;
        }
        return response()->json(['SUCCESS'=>$success,'API_STATUS' => 'SUCCESS'], $this->successStatus); 
    }

    public function verifyOtp(Request $request)
    {
        $input=$request->all();
        $user=User::where('otp',$input['otp'])->where('id',Auth::id())->first();
        if(!empty($user))
        {
            $temp_data=DB::table('temporary')->where('user_id',Auth::id())->select('data')->first();
            $temp_data=json_decode($temp_data->data,true);
            User::where('id',Auth::id())->update([
                'first_name'=>$temp_data['first_name'],
                'last_name'=>$temp_data['last_name'],
                'mobile'=>$temp_data['mobile'],
                'user_image'=>$temp_data['user_image'],
                'otp'=> null
            ]);
            DB::table('temporary')->where('user_id',Auth::id())->delete();
            return response()->json(['API_STATUS'=>'SUCCESS'], $this->successStatus); 
        }
        else
        {
            return response()->json(['API_STATUS'=>'FAIL'], $this->successStatus); 
        }
    }

最佳答案

您可以使用 DB::beginTransaction()DB::rollBack()DB::commit() 方法而不是 DB::transaction(callback)

https://laravel.com/docs/5.5/database#database-transactions

关于php - 如何在 laravel 中从一个函数开始事务并在另一个函数中结束它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46987515/

相关文章:

PHP 文件下载问题 - 无法读取

php - 在 PHP 中格式化 time()

php - 设置安全的轮询系统

javascript - 如何在 React 中插入具有多个外键的表?

MySQL 在查询中使用计数来搜索多行的可用性

php - 如何设置状态

php - Laravel:如何从数据库中获取最后 N 个条目

php - 在 Twitter Bootstrap 类中使用 "action"

laravel - 如何在 Laravel 迁移中的特定列之后订购多个新列

javascript - Nuxt 图像在页面更改时不断中断