我构建了一个小型的PHP MVC框架,只想阐明将数据从一个模型获取到另一个模型的最佳方法。例如:
我有一个包含一个名为 get_users(( 的方法的Users_model。
我也有需要获取特定或所有用户数据的Communications_model,因此需要从Users_model访问 get_users(( 方法。
最佳做法是:
a( 在控制器中实例化Users_model并将数据从 get_users(( 方法传递到Communications_model?
b( 在Communications_model中实例化Users_model并从那里运行 get_users((,以便可以直接访问它?
c( 另一种方式?
非常感谢任何帮助。
这取决于你背后的动机。
- 如果你想对结果产生影响,那么使用众所周知的库,如教义等应该是你的选择。
- 如果你想学习设计模式,那么你应该阅读ActiveRecord或DataMapper + Repository模式。然后实现两者并结帐。
- 如果你想要你的代码,这样 - ORM应该表示数据的关系,那么你应该问它更重要吗?如果您进行通信(公共汽车,火车(,则可以分配用户,并且可以从通信中获取用户。如果用户有通信(如汽车(,则关系颠倒。
一切都取决于,你背后的动机是什么。使用库,如 Doctrine,你能帮助你运行你的应用程序吗?如果您想学习设计模式,请查看这两个选项以获得一些经验。
你所说的"用户模型"是一个存储库。你所谓的"沟通模式"看起来像一种服务。
通信服务应将用户存储库作为依赖项传入构造函数。
老实说,我认为,你困惑的很大一部分是你试图称所有这些东西为"模型"。这些类不属于同一层。 你可能会发现这个答案很有用。
所有这些都是可能的方法,但我通常做的是,每当有任何我认为会被许多对象重用的函数时,我都会将其声明为 static
。
它将节省使用对象声明的工作量,并且可以通过ClassName::function();
轻松访问
同样,这是一个设计选择,通常对象在控制器中声明并根据需要使用,但只是为了一次又一次地保存对象的声明,我遵循声明函数static
的方法。
这里的简单原则是使用__construct()
(构造函数(使用数据库中的相关属性构建对象。用户模型将具有一个静态函数(因此可通过任何范围访问(,只需将模型数据传递到返回实例的new self()
即可创建实例化对象数组。
这个概念是,您最终会得到一个User_Model实例的数组,每个实例都是属性的数据库列的构建。剩下的就是创建数据库模型和函数来检索列和数据。
class Communications_Model {
private $_all_users;
public function getUsers() {
$this->_all_users = Users_Model::loadAllUsers();
}
}
class Users_Model {
private $_example_property;
public function __construct($user_id) {
$data = SomeDatabaseModel::getConnection()->loadUserFromDatabase((int)$user_id);
$this->_example_property = $data['example_column'];
}
public static function loadAllUsers() {
$users = array();
foreach(SomeDataModel::getConnection()->loadAllUsers() as $data) {
$users[] = new self($data['user_id']);
}
return $users;
}
}
当然,现在,您有一个 $_all_users;
属性,其中包含包含数据的实例化用户模型数组。