我需要一个数据映射/存储库解决方案,并希望避免编写自己的。
学说似乎满足了除了一个以外的所有要求,但我只是不知道如何去做。
我正在使用遗留数据库,我希望我的域对象与数据库完全无关,直到我们能够逐个淘汰旧应用程序(至少需要一年)。这意味着我需要一种方法将其他表中的字段添加到实体。
以下是一个例子:
<?php
namespace Entities;
class Article
{
protected $id;
protected $name; // from article table
protected $description; // from article_info table, joined from article table
protected $stock; // from article_variation_info, joined from article_info table
...
}
学说文档似乎表明了两种可能的解决方案:
我想避免使用第一个选项,因为我想为新应用程序创建一个干净的域模型,而不受过去的旧限制/错误决定的影响。必须为每个表创建实体似乎适得其反。
第二个选项看起来好一点,但如果我必须编写所有SQL,我可能会编写自己的PDO存储库和映射器。
我是否遗漏了某些东西或者说教条不是我想要做的理想解决方案?
答案 0 :(得分:2)
学说2不适合你的问题。它真的想要每个实体关系一个表。另一方面,一旦你过渡,事情就会好起来。
我认为观点是您最好的解决方案。我知道能力有限,但你应该能够解决它。
但是,您的第一个选择是可行的。重要的是,您的新模型有一个很好的清洁界面。您的应用程序只知道模型接口。模型层中没有持久性代码。
NewModel
NewArticleModel implements NewArticleModelInterface
NewArticleModelInterface
NewArticleRepositoryInterface
NewEntity
NewArticleEntity extends NewArticleModel
NewArticleEntityRepository implements NewArticleRepositoryInterface
OldEntity
OldArticleDoctrineEntity
OldArticleDoctrineRepository
诀窍是让NewArticleEntityRepository负责从OldArticleDoctrineEntity中构建NewArticleEntity。
最后,当数据库更新为直接支持NewArticleEntity时,您只需要调整存储库或插入新的存储库。再次,您的应用程序只知道模型级接口。
事实上,无论采用何种方法,创建持久性中性模型层可能都是开始的方式。