PHP依赖注入对象及其集合?

时间:2018-10-28 09:52:42

标签: oop dependency-injection

好的,我读了一些有关DI的文章和帖子,现在尝试在我正在研究的旧项目中申请我编写的新代码。

假设我已经有“用户”和“帖子”,现在我想添加“注释”,它对每个帖子的每个用户都是唯一的。

我可以轻松地将DI知识应用于基本的Note类:

class Note{
    private $db;
    private $_id = null;
    private $_userId = null;
    private $_postId = null;
    private $_text = null;

    public function __construct($db){
        $this->db = $db;
    }

    // Bunch of setUserId\GetUserId etc. methods 


    public function save(){
    // Do some db queries to save\update\create DB row
    }        
}

但是我不仅要创建新的笔记,还想批量查询现有笔记(即“当前用户的所有笔记”)。

在没有DI的情况下,我该如何做-在Note类中创建静态方法:

    /**
     * @return array|Note
     */
    static public function getUserNotes($userId)
    {
     // Do db query, fetch notes row, 
     // create Note objects from them and return an array of Note objects
    }

用法非常简单:$userNotes = Note::getUserNotes(123);

但是我应该如何用DI呢?从语义上讲,我不能再将此方法放入Note类中。我可能会想到的唯一一件事-创建额外的类

class NotesFetcher{
    private $db;

    public function __construct($db){
        $this->db = $db;
    }

    public function getUserNotes($userId){
    // Do some db queries to query DB and create array
    }        
}

然后它的用法是:

$db = new Db(...);
$notesFetcher = new NotesFetcher($db);
$userNotes = $notesFetcher->getUserNotes(123);

这是我应该遵循的正确方法吗?我感觉很多代码和额外的类,而不是一行。我可以肯定地看到了测试的好处,但是当您意识到需要2个额外的类(在某些时候还包括Dependency Container)和3个额外的代码行(而不是超级简单的调用$userNotes = Note::getUserNotes(123);)时,它仍然在某种程度上使人沮丧。

0 个答案:

没有答案