模型是否可以填充自己的属性?

时间:2011-09-26 22:24:09

标签: php oop dependency-injection tdd

如果我有一个基本上代表数据库中单行的模型,它是否具有扩展性和测试友好性,并且所有实践都可以让它填充它自己的属性,或者它应该注入其属性,你注入一个物体的方式相同吗?

示例:

Class blog {
    $id;
    $title;
    $body;

    public function load($id) {
        // db query to load id, title, body
    }
}

OR

Class blog {
    $id
    $title
    $body
}

// load blog data into $data, and then...

$blog = new Blog($data)

2 个答案:

答案 0 :(得分:1)

如果您想要从模型本身中分离数据存储层,您应该将其注入。

如果模型是数据存储抽象,你不需要关心,你只需要注入那些应该定义接口的模型,这样你就可以测试其他应用程序。

但这仅取决于您的需求和设计。

答案 1 :(得分:1)

直接在模型类中混合数据库访问被认为是一种不好的做法。注射值通常是首选。

那就是说,如果你已经死定了像$ model-> load($ id)这样的东西,并从数据源中获取它,你就可以逃避:

class Model {
    private $_dataProvider;

    // inject data-provider dependency in constructor
    public function __construct($dataProvider){
        $this->_dataProvider = $dataProvider;
    } 

    public function loadById($id){
        $myData = $this->_dataProvider->loadDataById($id);
        $this->setFoo($myData['foo']);
        ...
    } 
}

通过注入数据访问类,您可以传递模拟进行测试,或者使用某些Web服务或其他任何内容替换您的数据库。只要$ dataProvider有一个loadDataById()方法,它接受一个int并返回适当的数据结构,你就是好的。

就个人而言,我更喜欢保持我的模型很好,并专注于表示他们正在建模的任何东西。我依靠外部服务类和存储库来加载数据,将其注入模型并返回它们。