Symfony项目设计模式

pin*_* af 5 php oop design-patterns symfony

symfony 2安装程序提供了最佳实践目录结构,但没有说明如何使用这些目录,每个代码片段在哪里,确保symfony框架将其缩小到视图,实体和控制器,服务等.但更常见的是,程序员最终在控制器中放置了一个DQL查询,并在处理特定任务时使用了一些逻辑,而这就完成了工作,必须有一个更好的方法,甚至超越symfony开箱即用的目录结构,目前寻求更好的设计模式,尽可能模块化和重用

在这个任务中,在interwebz上发现了几篇好文章,并花了一天时间,它想出了一个计划,将所有数据库交互分离到存储库,所有逻辑服务,并保持控制器"瘦"作为中心从存储库和调用服务调用方法的要点.听起来不错,将是模块化的,代码可以重复使用....但是

这在某种程度上从OOP概念转移到程序编程,而不是它有任何问题,它只是没有利用OOP的强大概念

通过添加更多功能可以使对象更"强大",使其更好吗?根据定义,服务应该是一个单元的任务,我的方法会使它们变得大而丑

在这个博客上几个好点的位置,但便无法真正做到了什么,他们试图提出一个解决方案

一般而言,您在服务中发现的行为越多,您就越有可能剥夺自己对域模型的好处.如果你的所有逻辑都在服务中,那么你就会失明 - 马丁福勒

总结一下,面向服务的方法没有利用OOP的概念?怎么可以补充

mic*_*JlS 8

您可以在Fowler的"企业应用程序架构模式"中找到的最重要的想法之一就是您应该使用正确的工具来完成工作.根据您的问题和域的复杂性,一个或另一个设计模式/架构模式可能会表现得更好.遵循这种方式,与旧框架(ZF1,SF1)相比,SF2 +不会强迫您使用任何架构模式或以特定方式组织业务逻辑.你甚至可以把所有东西都放在捆绑结构之外.因此,您可以做的最好的事情是尝试更多地了解设计模式(通常).然后,当您需要时,您将能够选择最适合您案例的一个.

你可能想看看:


Dhe*_*raj 3

使用领域驱动设计,它会创建胖模型层,并且在控制器内调用大量服务可能会模块化您的代码,它仍然有自己的一系列挑战,它使设计更难创建,并且在某些时候会出现太控制器内部有很多服务调用,实际上可以做的是使用 DDD 中的一些概念。

在开始 DDD 之前要记住的两件事是:-

  1. 内聚力——一起改变的模块
  2. 耦合——相互依赖的模块

您需要减少耦合并认识到内聚性并据此设计项目,主要目标是允许将来添加和删除或启用/禁用/重新组合模块,以防您决定更改项目

使用接口代替捆绑包相互依赖

namespace MyProject\UserBundle\Activity ;

use MyProject\NotificationBundle\Notification;
use MyProject\MailBundle\Mail;
Run Code Online (Sandbox Code Playgroud)

其中 UserBundle 与NotificationBundle 耦合,而 MailBundle 使用抽象包的接口

namespace MyProject\UserBundle\Activity ;

use MyProject\ServiceBundle\NotificationInterface;
use MyProject\ServiceBundle\MailInterface;
Run Code Online (Sandbox Code Playgroud)

DDD的主要概念是

  1. 值对象- 保存一些数据并来回传递的对象,不关注身份而是关注它所保存的数据,值对象可以在 symfony 中使用可嵌入的方式使用
  2. 实体- 保存一些数据但依赖于身份值而不是其数据值的对象
  3. 存储库- 使用存储库类进行数据库操作使得以后可以更改实现,因为它集中到一个地方
  4. 聚合- 当多个对象像属于同一类别的许多事物一样属于在一起时(例如:属于一种流派的歌曲),则整个对象集合被视为一个对象,并且对这些对象进行更改将被视为单个对象聚合对象
  5. 领域事件- 领域/数据状态的任何变化都被视为一个事件,在 symfony 中有事件监听器和订阅者可以代替领域事件,这是 DDD 最重要的概念之一,过滤器也是一个很棒的概念对代码的改进
  6. 服务- 服务是执行工作单元的可调用代码模块,服务允许重用代码并且更容易测试和更新,symfony 中的服务应该包含域逻辑,并且服务层可以变得相当丰富,这与事件一起使代码更快、更易于维护
  7. 工厂模式- 此模式使用生成不同对象的“工厂”对象,通过这样做,第二个对象的名称被抽象,这有助于重构代码

这些是通用概念,需要应用于高度情境化的代码,正确的 DDD 要求代码模块化,这是一项具有挑战性的任务,需要工程师具备一定的经验。

正如其他人已经说过的,“martin fowler”的书籍、“gang of four”的“V.Vernon”设计模式等将是一本很好的读物