gpt4 book ai didi

PHP/MySQL : Database class and dependency injection

转载 作者:行者123 更新时间:2023-11-29 12:17:30 25 4
gpt4 key购买 nike

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

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

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

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

如您所见,addCourse 和incrementStudentCount 方法都必须在单事务模式下工作。但是,学生和类(class)类不知道事务是否在$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();
}
}
}
}

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

最佳答案

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

是否有事务并不重要:无论如何,他们仍然应该做同样的事情,即插入行。我建议您有一个 Controller 来处理这两项任务,如下所示:

$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();
}

关于PHP/MySQL : Database class and dependency injection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com