如果我有一个基本上代表数据库中单行的模型,它是否具有扩展性和测试友好性,并且所有实践都可以让它填充它自己的属性,或者它应该注入其属性,你注入一个物体的方式相同吗?
示例:
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)
答案 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并返回适当的数据结构,你就是好的。
就个人而言,我更喜欢保持我的模型很好,并专注于表示他们正在建模的任何东西。我依靠外部服务类和存储库来加载数据,将其注入模型并返回它们。