PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php-无法在Laravel(DB :: beginTransaction)的Controller中使用数据库事务大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个具有存储方法的DoctorsController.我正在测试此方法,并且希望我的模型不要在测试环境中插入其数据.因此,我在控制器和测试方法中使用了DB :: begintransaction,DB :: rollBACk(),DB :: commit()方法来防止INSERT@L_616_6@.我的问题是=>我的测试运行时数据库正在记录.我在测试期间不需要任何插入内容.

我的测试代码

public function testStoreMethod()
{
    /*
     * Test when validation fails
     */
    $data = include_once('DoctorsControllerFormData.PHP');

    foreach($data as $item){
        DB::begintransaction();
        $response = $this->call('POST', 'doctors', $item);
        $this->assertResponseStatus(400, "response's http code is not 400 : " . implode('\n',array_flatten($item)));
        Log::debug($responsE);
        DB::rollBACk();
    }
}

我的DoctorsController代码片段:(调用UsersController的store方法)

public function store()
{
    //some code
    DB::begintransaction();
    try{
        /*
         * User Creation
         */
        $user = new UsersController();
        $user->setresource('doctor');
        $userID = $user->store();

        //some other code
    }catch (InputValidationFailedException $E){
        DB::rollBACk();
        return Response::make(json_encode(array('error' => $e->getErrors())), \Symfony\Component\httpFoundation\Response::http_BAD_requEST);
    }catch(Exception $E){
        Log::error('Server Error at DoctorsController');
        DB::rollBACk();
        App::abort(500, $e->getmessage());
    }
}

我的UsersController代码段:

public function store()
{
    $user = new User;

    try{
        $inputs = Input::all();
        Log::info("input Data" . implode("\n", array_flatten(Input::all())));
        /*
         * User Creation
         */
        $v = Validator::make(
            $inputs,
            User::$rules
        );

        if($v->fails()) {
            Log::error('Validation Failed! ' . implode("\n", array_flatten($v->messages()->all())));
            throw new InputValidationFailedException($v);
        }
        $user->fname = Input::get('fname');//set first name
        $user->lname = Input::get('lname');//set last name
        $user->email = Input::get('email');//set email
        $user->cell = Input::get('cell');//set cell number
        $user->password = Hash::make(Input::get('password'));//set password
        $user->gender_id = Input::get('gender') == 'm' ? 1 : 0;//set gender
        $user->is_active = 0;//set activation status
        $user->role_id = ($this->resource == 'doctor') ? 1 : 2;
        $user->activation_time = 0;//set activation time default to 0
        $user->expiration_time = 0;//set expiration time default to 0
        //insert the user into DB
        $user->save();
    }catch (InputValidationFailedException $E){
        Log::info('User Validation Failed! ' . implode("\n", array_flatten($e->getErrors())));
        throw $e;
    }catch (Exception $E){
        Log::error('Server Error at UsersController!');
        throw $e;
    }

    return $user->id;
}

谢谢你的帮助.

解决方法:

如果要在控制器中提交更改,则测试中的DB:rollBACk无法撤消那些更改,因为事务已在此处完成.话如此,您实际上不应该使用与开发相同的数据库进行测试. Laravel有Migrations & Seeding,您可以在每次运行测试时使用refresh and reseed专用的测试数据库.

如果可能的话,我建议使用内存数据库来避免完全写入持久性数据库,如下面的视频所示:

大佬总结

以上是大佬教程为你收集整理的php-无法在Laravel(DB :: beginTransaction)的Controller中使用数据库事务全部内容,希望文章能够帮你解决php-无法在Laravel(DB :: beginTransaction)的Controller中使用数据库事务所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: