【发布时间】: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