【问题标题】:Php/Mysql: Database class and dependency injectionPHP/Mysql:数据库类和依赖注入
【发布时间】:2015-04-09 19:14:31
【问题描述】:

我正在尝试将依赖注入模式应用于我一直在从事的中型项目。我的大多数类在某种程度上与数据库交互,而不是在每个类中实例化一个 pdo 对象,我在控制器级别实例化一个 pdo 对象并将这个对象注入需要数据库连接的类。这样,所有类都使用相同的连接,整个过程使单元测试变得非常容易。

但是,当我尝试对这些类使用事务时,事情变得有点复杂。我们的数据库严重去规范化,每个动作都需要来自不同类的多次插入/更新。举一个基本的例子,假设我们有以下类:

    class student{
        public function addCourse($pdo,$course){
            //$pdo->execute();
        }
    }

    class course{
        public function incrementStudentCount($pdo){
            //$pdo->execute();
        }
    }

如您所见,addCourse 和 incrementStudentCount 方法都必须在单一事务模式下工作。但是,学生和课程类不知道事务是否在 $pdo 对象中开始。他们不知道在出现问题时是否需要回滚。

我想创建一个 PDO 包装类并将该类用于数据库交互。这样,我可以将事务状态保留在此类中。基本上,它看起来像这样:

    class PDOWrapper {
        private $transactionStarted=false;
        private $pdo;
        public function __construct($pdo){
            $this->pdo=$pdo;
        }
        public function startTransaction(){
            $this->transactionStarted=true; 
            $this->pdo->beginTransaction()
        }
        public function query($query){
            try{
                //$this->db->execute($query);
            }
            catch(PDOException e){
                if($this->transactionStarted){
                    $this->db->rollBack();
                }
            }
        }
    }

嗯,我不确定这种方法是否可行。那么,你有什么建议呢?

【问题讨论】:

  • 那么你有什么问题或者你想用你想出的代码来解决什么问题?

标签: php mysql oop pdo dependency-injection


【解决方案1】:

您是对的,您的班级不应该知道其他班级/数据库中发生了什么。这些都不重要,所有关注的studentuser 类都在插入到数据库中。

是否存在事务无关紧要:他们仍然应该做与他们所做的完全相同的事情,即插入行。我建议您使用一个控制器来处理这两项任务,如下所示:

$pdo->startTransaction();
//However you instantiate the course object, do it here
$course = new Course;
//Same with student
$student = new Student;
$student->addCourse($pdo, $course);
$course->incrementStudentCount($pdo);
$pdo->commit();

当您提交到数据库时,您的所有查询都将通过。如果出现这样的错误,您可以回滚:

try
{
    $pdo->startTransaction();
    //Code
}
catch(PDOException $e)
{
    $pdo->rollback();
}

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多