存储库&x2B;PHP中具有多重继承的类的工厂模式实现?

存储库&x2B;PHP中具有多重继承的类的工厂模式实现?,php,design-patterns,architecture,repository-pattern,factory-pattern,Php,Design Patterns,Architecture,Repository Pattern,Factory Pattern,这里是这样的:假设我有一个User抽象类。此类扩展为Employee和Customer子类 User类具有基本属性,如name和addressEmployee有一个附加属性sallary客户有一个附加属性成员资格\u code 这些实体存储在多个表中:用户、员工和客户。users表包含有关任何用户的基本信息。employees和customers表指的是users表,其中每个表都包含附加属性 用户表格: id | name | address | type ---

这里是这样的:假设我有一个
User
抽象类。此类扩展为
Employee
Customer
子类

User
类具有基本属性,如
name
address
Employee
有一个附加属性
sallary
<代码>客户有一个附加属性
成员资格\u code

这些实体存储在多个表中:
用户
员工
客户
users
表包含有关任何用户的基本信息。
employees
customers
表指的是
users
表,其中每个表都包含附加属性

用户
表格:

id | name       | address           | type
---+------------+-------------------+---------
1  | Employee 1 | First Address St. | Employee
2  | Customer 1 | First Address St. | Customer
user_id | salary
--------+---------
1       | 5000
user_id | membership_code
--------+---------
2       | 1325_5523_2351
员工
表格:

id | name       | address           | type
---+------------+-------------------+---------
1  | Employee 1 | First Address St. | Employee
2  | Customer 1 | First Address St. | Customer
user_id | salary
--------+---------
1       | 5000
user_id | membership_code
--------+---------
2       | 1325_5523_2351
客户
表格:

id | name       | address           | type
---+------------+-------------------+---------
1  | Employee 1 | First Address St. | Employee
2  | Customer 1 | First Address St. | Customer
user_id | salary
--------+---------
1       | 5000
user_id | membership_code
--------+---------
2       | 1325_5523_2351
以下是关于如何在PHP中实现这些功能的想法:

抽象类用户
{
受保护的$id;
受保护的$名称;
公共静态函数加载(int$id):用户
{
/**@var数组$data*/
$data=get_a_row_from_users_table_by($id);//此部分对数据库进行查询
返回新的$data['type']($data['id'],$data['name']);
}
最终公共函数构造($id,$name)
{
$this->id=$id;
$this->name=$name;
$this->init();
}
抽象保护函数init();
}
类Employee扩展用户
{
受保护的美元工资;
受保护函数init()
{
/**@var数组$data*/
$data=get_a_row_from_employees_table_by($this->id);//此部分对数据库进行查询
$this->salary=$data['salary'];
}
}
类Customer扩展用户
{
受保护的$U代码;
受保护函数init()
{
/**@var数组$data*/
$data=get_a_row_from_customers_table_by($this->id);//这部分对数据库进行查询
$this->salary=$data['membership_code'];
}
}
以下是它在控制器中的外观:

$employee=User::load(1);//返回员工类型
$customer=User::加载(2);//退货客户类型
然而,我觉得上面的代码似乎仍然有点难以维护。最近我读了一本书,讨论了域驱动的设计以及如何将持久性机制分离到存储库中。另一方面,我还发现类型转换机制,例如
员工
客户
之间的转换机制,应该在工厂中完成

我对存储库工厂的概念有一点了解,但我仍然无法理解如何将这些概念组合并实现为一个工作代码


在这种情况下,应该如何实现上述功能以在PHP中使用存储库工厂模式?

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

请记住,您的实体(如
用户
)不应该依赖于基础架构,原因是将基础架构包含到实体中会使您远离SRP。。。在上面的示例中,您的
用户
实体做了太多的工作。。。读取和写入DB的逻辑应该从实体中拉出。。。它们属于
UserRepository


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

如果您希望在项目中使用存储库模式或企业体系结构;有些ORM库就是这样设计的。也许您可以检查PHP库()。在活动记录实现中使用存储库模式没有多大意义。active record的强大功能是能够在任何需要的地方访问数据库实体和关系—它们已经包含在存储库中。如果您这样做,您的存储库将成为存储库存储库。@HilmiErdemKEREN好吧,这是可以做到的,但我不想太依赖于某些库。我试图从体系结构的角度来研究这个问题——找出如何用原生PHP的方式设计一个简单的案例,如said。据我所知,使用Repository模式的好处是将域逻辑与数据持久性逻辑分离,以便以后可以轻松地用任何形式的选择替换它,而无需对域代码进行太多重构。您在这里提到的是非常好的实践。然而,我认为我们需要一个范围。作为创造者;我们必须解决实际存在的问题。我们不应该试图解决我们认为在未知的未来会发生的问题。例如:如果你正在创建一个既支持教义又支持雄辩的图书馆;为您的服务提供存储库模式非常好。这样你就可以很容易地在两者之间切换。但如果我们谈论的是一个企业项目;相信我,你不会改变主意的。存储库模式仍然有利于拥有一个体系结构并易于协作。