实体管理服务,我是不是太复杂了?

时间:2013-12-02 14:46:17

标签: php symfony soa

我目前正在尝试使用Symfony(版本2.3)创建自己的授权系统。而且我不确定我是否过于复杂,我对Symfony和SOA都很陌生。我正在创建自己的授权系统,因为我需要根据当前用户,其角色和当前客户(当前用户可以更改客户)及其产品来限制权限。

我现在拥有的东西,我认为可能过于复杂,如下:

Foreach实体我只有一个读取操作的存储库:

MyBundle/Entities/
                  Customer.php/CustomerRepository.php
                  Product.php/ProductRepository.php
                  ...

抽象存储库的用法以及处理create / update / delete。每个实体都有一个Manager类,它使用存储库(代理存储库和使用不同存储库的组合)。

MyBundle/Manager/
                  CustomerManager.php
                  ProductManager.php
                  ...

然后,根据当前用户,其角色以及当前选定的客户及其产品,我的课程正在获得授权。他们使用Managers加载所有acl数据。

MyBundle/Authorization/
                       AuthCustomers.php //Allowed customers to which user is assigned
                       AuthRights.php    //Rights according to user and customer

服务看起来像这样:

auth.manager.product:
    class: MyBundle\Manager\ProductManager
    arguments: ["@doctrine.odm.mongodb.document_manager"]
auth.manager.customer:
    class: MyBundle\Manager\CustomerManager
    arguments: ["@doctrine.odm.mongodb.document_manager"]

auth.authorization.authorization_rights_factory:
    class: MyBundle\Authorization\AuthorizationRightsFactory
    arguments: ["@auth.manager.role", "@auth.manager.customer"]
auth.authorization.authorization_customers_factory:
    class: MyBundle\Authorization\AuthorizationCustomersFactory
    arguments: ["@auth.manager.group", "@auth.manager.customer"]

直到这一点,我才认为它没问题。但是我现在需要什么以及我关心的是,当对这些实体中的任何实体做一些操作时,如果我被允许这样做,我实际上需要检查我的AuthorizationXXX服务。因此,Authorization类取决于Manager,反之亦然 要抽象它(为了防止无限引用,我可以在控制器和命令脚本中重用它),我现在将创建另一个服务,我注入AuthorizationManager服务并执行这些检查。所以我实际上会有另一位经理为我的服务。

最后,我将有7个实体,7个存储库和7个管理器+一些授权类+ 7个服务来组合管理器和授权类。

现在的问题是,这是正确的方法吗?我真的觉得我太复杂了。欢迎任何更简单的建议:)

2 个答案:

答案 0 :(得分:0)

选民似乎符合您的需求,请查看文档:{​​{3}}

您可以创建一个选民,将当前用户,他的角色和当前客户作为参数,如果您的业务规则得到尊重则返回true,否则返回false。

答案 1 :(得分:0)

最后,我现在只保留了结构,只是稍微改变了层的含义。 我现在拥有并感到舒服的是:

Repositories对于只读操作,知道其他存储库(这里我在开头过度使用它想要保持repos不知道彼此)。

Manager处理实体的持久性并代理Repositories的读取操作。他们不关心Authorization

Authorization只处理我的授权事务的服务,因此可以在任何地方重复使用,而无需执行Symfony特定的事情。

Model服务,它结合了ManagerAuthorization以及所有相关性。实际上,Symfony控制器只会调用模型服务的方法。但有了这个,我也可以将它重用于命令行脚本等。

我仍然有很多课程,但他们现在很好地分开,只做他们的东西,可以很容易地更换。

总的来说,我还详细研究了FOSUserBundle以获得灵感。我认为他们一般来说解决得很好。