【问题标题】:Cannot access protected property Illuminate\Database\MySqlConnection::$pdo无法访问受保护的属性 Illuminate\Database\MySqlConnection::$pdo
【发布时间】:2013-06-16 15:45:05
【问题描述】:

这个错误是什么以及如何捕捉它?

Cannot access protected property Illuminate\Database\MySqlConnection::$pdo

这是我的代码:

if($user->save())
        {
            try
            {
                DB::connection()->pdo->beginTransaction();

                Mymodel::insert('credit-card',array('user_id'=>$user->id,'card_holder'=>Input::get('custname')));
                Mymodel::insert('billing-info',array('user_id'=>$user->id,'name'=>Input::get('custname')));

                DB::connection()->pdo->commit();

                Auth::login( $user );
                return Redirect::to( 'profile' );
            }
            catch (\PDOException $e)
            {
                $user->delete();
                DB::connection()->pdo->rollBack();
                return 'ERROR: Something went wrong. Please try again later';
            }
        }

【问题讨论】:

    标签: php pdo laravel laravel-4


    【解决方案1】:

    如何捕捉它?

    你无法捕获它 - Exceptions 是可捕获的,这是一个普通错误。

    这是什么错误

    这里:

    DB::connection()->pdo->beginTransaction();
    

    您正试图直接访问由DB::connection() 返回的对象的pdo 属性。此属性被声明为受保护以防止直接访问它并以可能导致整个框架的不可预测行为的方式进行操作。

    quick look at source code看来,事务可以这样实现:

    DB::connection()->transaction(function() use($user){
        Mymodel::insert('credit-card',array('user_id'=>$user->id,'card_holder'=>Input::get('custname')));
        Mymodel::insert('billing-info',array('user_id'=>$user->id,'name'=>Input::get('custname')));
    });
    

    【讨论】:

    • 我也打算采用这种方法,但是我在 catch 可以显示错误消息的部分之后。在给定代码中执行此操作的正确方法是什么?参考:[laravelish.wordpress.com/2013/02/21/…
    • 您的 try/catch 块可以保留,MyModel::insert 抛出的每个异常都将被重新抛出,您可以捕获它。只需从中删除DB::connection()->pdo->rollBack();。另请注意,您引用的文章标记为 laravel-3 - 很可能在较新版本中已更改。
    【解决方案2】:

    您也可以在每个语句中使用 getPdo() 代替 pdo,因为 pdo 财产现在受到保护。使用 getPdo() 方法获取。

    DB::connection()->getPdo()->beginTransaction();
     ........
     ........
    DB::connection()->getPdo()->commit();
    ......
    ......
    DB::connection()->getPdo()->rollBack();
    

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 2021-09-15
      • 2018-11-18
      • 2019-10-18
      • 1970-01-01
      • 2012-12-28
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多