Php 模型可以填充自己的属性吗?
如果我有一个基本上代表数据库中一行的模型,那么它是否适合于扩展和测试,以及让它填充它自己的属性,或者应该让它注入它的属性,就像注入对象一样 例如:Php 模型可以填充自己的属性吗?,php,oop,dependency-injection,tdd,Php,Oop,Dependency Injection,Tdd,如果我有一个基本上代表数据库中一行的模型,那么它是否适合于扩展和测试,以及让它填充它自己的属性,或者应该让它注入它的属性,就像注入对象一样 例如: Class blog { $id; $title; $body; public function load($id) { // db query to load id, title, body } } 或 如果您想将数据存储层与模型本身分离,那么应该使其可注入 如果模型是数据存储抽象,您不需
Class blog {
$id;
$title;
$body;
public function load($id) {
// db query to load id, title, body
}
}
或
如果您想将数据存储层与模型本身分离,那么应该使其可注入 如果模型是数据存储抽象,您不需要在意,只需要注入模型,然后模型应该有定义的接口,这样您就可以测试应用程序的其余部分
但这仅仅取决于您的需求和设计。将数据库访问直接混合在模型类中被认为是一种不好的做法。通常首选注入值 这就是说,如果您死心塌地地执行$model->load($id)之类的操作,并从数据源获取它,那么您可以使用以下方法: 通过注入一个数据访问类,您可以传递一个模拟来进行测试,或者用一些web服务替换您的数据库,等等。只要$dataProvider有一个loadDataById()方法,该方法接受int并返回适当的数据结构,就可以了
就个人而言,我更喜欢保持我的模型良好,并专注于代表他们正在建模的任何东西。我依靠外部服务类和存储库来加载数据、将数据注入模型并返回它们 当你说数据存储抽象时,你是指CRUD风格的函数吗?例如,Blog类也可能有一个$blog -URL()函数…我是指将模型数据存储到持久存储(例如HTTP请求之间)的层。我明白了,所以您认为数据访问与业务逻辑在这种情况下是分开的吗?假设您已经调整了模型中的数据…可能更改了标题-您是使用模型保存数据,还是将数据注入$dataProvider?在该示例中,模型依赖于
数据提供程序
。哈克雷:我同意,这是一个需要仔细考虑的设计决定。我的关键点是,如果要创建依赖项,请使其可注入。johnnietheblack-是的,某种save()方法只会代理dataProvider::save(),它会将属性数组的对象本身作为参数。@timdev-那么,除了我能做的以外,什么是正常的?我知道从一个表中提取数据并在数据上运行函数是正常的……这通常会被分成这样的类吗?还有,有没有你可以推荐的教程?谢谢
Class blog {
$id
$title
$body
}
// load blog data into $data, and then...
$blog = new Blog($data)
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']);
...
}
}