PHP中具有多重继承的类的存储库+工厂模式实现



情况如下:假设我有一个User抽象类。该类被扩展为EmployeeCustomer子类。

User类具有类似于nameaddress的基本属性。CCD_ 7具有附加的属性CCD_。CCD_ 9具有附加的属性CCD_。

这些实体存储在多个表中:usersemployeescustomersusers表包含关于任何用户的基本信息。employeescustomers表是指users表,每个表中都包含附加属性。

users表格:

id | name       | address           | type
---+------------+-------------------+---------
1  | Employee 1 | First Address St. | Employee
2  | Customer 1 | First Address St. | Customer

employees表格:

user_id | salary
--------+---------
1       | 5000

customers表格:

user_id | membership_code
--------+---------
2       | 1325_5523_2351

以下是我对如何在PHP中实现这些功能的想法:

abstract class User
{
protected $id;
protected $name;
public static function load(int $id): User
{
/** @var array $data */
$data = get_a_row_from_users_table_by($id); // this part does a query to DB
return new $data['type']($data['id'], $data['name']);
}
final public function __construct($id, $name)
{
$this->id = $id;
$this->name = $name;
$this->init();
}
abstract protected function init();
}
class Employee extends User
{
protected $salary;
protected function init()
{
/** @var array $data */
$data = get_a_row_from_employees_table_by($this->id); // this part does a query to DB
$this->salary = $data['salary'];
}
}
class Customer extends User
{
protected $membership_code;
protected function init()
{
/** @var array $data */
$data = get_a_row_from_customers_table_by($this->id); // this part does a query to DB
$this->salary = $data['membership_code'];
}
}

以下是它在控制器中的样子:

$employee = User::load(1); // return Employee type
$customer= User::load(2); // return Customer type

然而,我觉得上面的代码维护起来仍然有点麻烦。最近我读了一本书,讨论域驱动的设计以及如何将持久性机制分离到存储库中。另一方面,我还发现类型切换机制,例如EmployeeCustomer之间的类型切换机制应该在工厂中完成。

我对RepositoryFactory的概念有一点了解,但我仍然不理解如何将这些概念组合并实现为一个工作代码。

在这种情况下,应该如何实现以上内容以在PHP中使用RepositoryFactory模式?

创建User抽象基类的方法很好。你的桌子结构看起来也不错。

请记住,您的实体(如User(不应该依赖于基础设施,原因是将基础设施纳入您的实体会使您远离SRP。。。在上面的示例中,您的User实体正在做太多的工作。。。读取和写入DB的逻辑应该从实体中提取。。。属于CCD_ 26

您关于将持久性机制放入存储库的假设是正确的。您可以实现一个返回EmployeeCustomer的通用UserRepository。。。您可以选择如何实现通用存储库,但无论如何,持久性逻辑都不属于User实体。

最新更新