Symfony应用程序中的学说实体和业务逻辑

高丽尼克

任何想法/反馈都欢迎:)

在一个大型Symfony2应用程序中如何处理围绕Doctrine2实体的业务逻辑时遇到一个问题(对不起,文章长度)

阅读了许多博客,食谱和其他资源后,我发现:

  • 实体可能仅用于数据映射持久性(“贫血模型”),
  • 控制器必须尽可能苗条,
  • 域模型必须与持久层分离(实体不知道实体管理器)

好的,我完全同意,但是:在何处以及如何处理域模型上的复杂业务规则?


一个简单的例子

我们的域模型:

  • 可以使用角色
  • 一个角色可以被不同的组使用
  • 一个用户可以属于多个与许多角色

SQL持久层中,我们可以将这些关系建模为:

在此处输入图片说明

我们的特定业务规则:

  • 仅当将角色附加到组时,用户才能组中具有角色
  • 如果我们组G1分离角色R1,则必须删除具有组G1和角色R1的所有UserRoleAffectation

这是一个非常简单的示例,但是我想知道管理这些业务规则的最佳方法。


找到解决方案

1-在服务层中的实现

将特定的Service类用作:

class GroupRoleAffectionService {

  function linkRoleToGroup ($role, $group)
  { 
    //... 
  }

  function unlinkRoleToGroup ($role, $group)
  {
    //business logic to find all invalid UserRoleAffectation with these role and group
    ...

    // BL to remove all found UserRoleAffectation OR to throw exception.
    ...

    // detach role  
    $group->removeRole($role)

    //save all handled entities;
    $em->flush();   
}
  • (+)每个类别/每个业务规则一项服务
  • (-)API实体不代表域:可以$group->removeRole($role)从此服务中出。
  • (-)一个大型应用程序中的服务类太多?

2-在域实体管理器中的实现

将这些业务逻辑封装在特定的“域实体管理器”中,也称为模型提供者:

class GroupManager {

    function create($name){...}

    function remove($group) {...}

    function store($group){...}

    // ...

    function linkRole($group, $role) {...}

    function unlinkRoleToGroup ($group, $role)
    {

    // ... (as in previous service code)
    }

    function otherBusinessRule($params) {...}
}
  • (+)所有业务规则都是集中的
  • (-)API实体不代表域:可以从服务中调用$ group-> removeRole($ role)...
  • (-)域管理员成为FAT管理者?

3-尽可能使用侦听器

使用symfony和/或Doctrine事件侦听器:

class CheckUserRoleAffectationEventSubscriber implements EventSubscriber
{
    // listen when a M2M relation between Group and Role is removed
    public function getSubscribedEvents()
    {
        return array(
            'preRemove'
        );
    }

   public function preRemove(LifecycleEventArgs $event)
   {
    // BL here ...
   }

4-通过扩展实体来实现丰富的模型

将实体用作域模型类的子/父类,该类封装了许多域逻辑。但是这种解决方案对我来说似乎更加困惑。


对您来说,管理此业务逻辑的最佳方法是什么,将重点放在更干净,分离,可测试的代码上?您的反馈和良好做法?你有具体的例子吗?

主要资源:

托马斯·德米塞克(Tomas Dermisek)

从更长的角度来看,我发现解决方案1)是最容易维护的解决方案。解决方案2导致leads肿的“经理”类,最终将其分解成较小的块。

http://c2.com/cgi/wiki?DontNameClassesObjectManagerHandlerOrData

“大型应用程序中的服务类别过多”并不是避免SRP的原因。

在域语言方面,我发现以下代码类似:

$groupRoleService->removeRoleFromGroup($role, $group);

$group->removeRole($role);

同样,从您描述的内容来看,从组中删除/添加角色需要很多依赖项(依赖关系反转原理),而使用FAT /膨胀管理器可能很难做到。

解决方案3)与1)非常相似-每个订阅者实际上都是由实体管理器在后台自动触发的服务,在较简单的情况下它可以工作,但是一旦操作(添加/删除角色)需要大量上下文,就会出现麻烦。例如。哪个用户执行了操作,从哪个页面或任何其他类型的复杂验证中进行了操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将带有Core Data的业务逻辑放在IOS应用程序中?

来自分类Dev

如何在企业级应用程序中从Web项目隐藏业务逻辑数据

来自分类Dev

如何使Spring应用程序的业务逻辑用户可配置?

来自分类Dev

独立于应用程序业务逻辑的Spring异步线程

来自分类Dev

实体和MySQL中的学说数组类型(Symfony2)

来自分类Dev

使用Azure App Service的Web应用程序和移动客户端具有相同的业务逻辑

来自分类Dev

在C#中调度类型vs多态。业务实体和非业务逻辑

来自分类Dev

实体框架4.1和业务逻辑层

来自分类Dev

实体框架4.1和业务逻辑层

来自分类Dev

Azure逻辑应用程序中的日期比较获取实体连接器

来自分类Dev

在Azure逻辑应用程序中对Azure表格存储实体进行排序

来自分类Dev

Web应用程序和桌面应用程序中的实体状态

来自分类Dev

咨询symfony中的实体关系(学说)

来自分类Dev

咨询symfony中的实体关系(学说)

来自分类Dev

在Scala中的应用程序之间共享业务层

来自分类Dev

现在WPF中业务应用程序的发展趋势

来自分类Dev

在Scala中的应用程序之间共享业务层

来自分类Dev

在Polymer应用程序中最好处理业务逻辑的地方是什么?

来自分类Dev

在其余应用程序上封装业务逻辑的最佳方法是什么?

来自分类Dev

设计问题-Dot-Net 3层应用程序中的ORM与OOP-对象应自行保留还是仅业务逻辑层应调用DAL

来自分类Dev

我可以创建单独的 ts 文件来为 Angular 4 应用程序中的所有组件编写业务逻辑吗?

来自分类Dev

Rails 4应用程序中的Sendgrid API和用户订阅逻辑

来自分类Dev

用于在逻辑应用程序中解码的 XSD 和 X12 830 02000

来自分类Dev

Symfony2“ php应用程序/控制台学说:schema:update --force”不会在表中添加列

来自分类Dev

使用Swift和Firebase聊天应用程序逻辑

来自分类Dev

复杂的JSON和逻辑应用程序带来的挑战

来自分类Dev

azure 逻辑应用程序和 http 阶跃响应

来自分类Dev

Symfony - 学说 - 更改编码 - 所有实体和行

来自分类Dev

实体类的业务逻辑

Related 相关文章

  1. 1

    如何将带有Core Data的业务逻辑放在IOS应用程序中?

  2. 2

    如何在企业级应用程序中从Web项目隐藏业务逻辑数据

  3. 3

    如何使Spring应用程序的业务逻辑用户可配置?

  4. 4

    独立于应用程序业务逻辑的Spring异步线程

  5. 5

    实体和MySQL中的学说数组类型(Symfony2)

  6. 6

    使用Azure App Service的Web应用程序和移动客户端具有相同的业务逻辑

  7. 7

    在C#中调度类型vs多态。业务实体和非业务逻辑

  8. 8

    实体框架4.1和业务逻辑层

  9. 9

    实体框架4.1和业务逻辑层

  10. 10

    Azure逻辑应用程序中的日期比较获取实体连接器

  11. 11

    在Azure逻辑应用程序中对Azure表格存储实体进行排序

  12. 12

    Web应用程序和桌面应用程序中的实体状态

  13. 13

    咨询symfony中的实体关系(学说)

  14. 14

    咨询symfony中的实体关系(学说)

  15. 15

    在Scala中的应用程序之间共享业务层

  16. 16

    现在WPF中业务应用程序的发展趋势

  17. 17

    在Scala中的应用程序之间共享业务层

  18. 18

    在Polymer应用程序中最好处理业务逻辑的地方是什么?

  19. 19

    在其余应用程序上封装业务逻辑的最佳方法是什么?

  20. 20

    设计问题-Dot-Net 3层应用程序中的ORM与OOP-对象应自行保留还是仅业务逻辑层应调用DAL

  21. 21

    我可以创建单独的 ts 文件来为 Angular 4 应用程序中的所有组件编写业务逻辑吗?

  22. 22

    Rails 4应用程序中的Sendgrid API和用户订阅逻辑

  23. 23

    用于在逻辑应用程序中解码的 XSD 和 X12 830 02000

  24. 24

    Symfony2“ php应用程序/控制台学说:schema:update --force”不会在表中添加列

  25. 25

    使用Swift和Firebase聊天应用程序逻辑

  26. 26

    复杂的JSON和逻辑应用程序带来的挑战

  27. 27

    azure 逻辑应用程序和 http 阶跃响应

  28. 28

    Symfony - 学说 - 更改编码 - 所有实体和行

  29. 29

    实体类的业务逻辑

热门标签

归档