php – 将业务逻辑放在实体中
我已经阅读了福勒关于“贫血领域模型”的文章(链接:
http://www.martinfowler.com/bliki/AnemicDomainModel.html),我同意他的观点.
我试图创建一个实体是简单POPO的应用程序,但是这样,我有一个胖服务层,而将一些逻辑放到实体中将是最简单的解决方案. 所以我会有这样的架构: ^ | Twig | Controller | API | Service | Model | Entity 哪里: 实体:将是简单的POPO,只是一袋二传手和吸气剂 模型:将是用业务逻辑装饰的实体对象 服务:包含涉及多个实体的所有业务逻辑(这里我也将放置验证任务),并且像转换器实体一样 – >模型 控制器| API:只匹配Request with Service,ParamConvert并检查autorization Twig:表示层 我的问题是如何将实体层隐藏到控制器并且仅适用于模型. 所以,一个愚蠢的例子: namespace ...EntityArticle; class Article { private $id; private $description; // getter and setter } namespace ...ModelArticle; class Article { private $article; // all methods will be exposed in some way private $storeService; // all required services will be injected public function __construct($article,$storeService) { $this->article = $article; $this->storeService = $storeService; } public function getEntity() { return $this->article; } public function isAvailable() { return $storeService->checkAvailability($this->article); } ... } class ArticleService { private $storeService; // DI private $em; // DI private $repository; // Repository of entity class Article public function findById($id) { $article = $this->repository->findById($id); return new ModelArticle($article,$storeService); } public function save(ModelArticle $article) { $this->em->persist($article->getEntity()); } ... } 上层是以通常的方式制作的. $articleService->isAvailable($article); 而不是更多的OO: $article->isAvailable();
我有DoctrineEntity对象扩展DomainModel对象.虽然控制器实际上可以接收DoctrineEntities,但它们只能在DomainModelInterface上运行.
... namespace DomainModel; interface ArticleDomainModelInterface ... interface ArticleDomainModelRepositoryInterface ... // create,find,save,commit class ArticleDomainModel implements ArticleDomainModelInterface ... namespace Doctrine; class ArticleDoctrineEntity extends ArticleDomainModel class ArticleDoctrineRepository implements ArticleDomainModelRepositoryInterface ... namespace Memory; // Usually dont need a memory article object class ArticleMemoryRepository implements ArticleDomainModelRepositoryInterface 所有模型创建和持久性都通过存储库完成.控制器和其他相关服务仅知道ArticleDomainModel方法.这为您提供了良好的分离,并允许使用不同的存储库进行测试或支持不同的持久性机制.它还允许在域模型中使用值对象,同时仍然使用Doctrine 2持久化它们. 但是,在php中,我确实很难理解在域模型对象本身中实际可以放置什么样的有用业务逻辑.我倾向于最终得到服务中的大部分逻辑.这是因为我的大多数程序都是面向严重的. 还有一个问题:控制器本身是否可以访问域模型对象? Doctrine 2的主要开发人员之一,Benjamin Eberlei,有很多关于这个主题的博客文章.他的所有文章都值得详细阅读.这里有一些: http://www.whitewashing.de/2013/07/24/doctrine_and_domainevents.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |