确定给定对象的实体管理器

时间:2014-01-22 18:14:39

标签: php symfony doctrine-orm

我有一个使用多个实体管理器的Web应用程序。我想知道是否有可能确定哪个实体经理正在管理特定对象。

在我的选民中,我从那里给出了对象,我需要获取对象实体管理器,以便我可以检查由同一个管理器管理的其他对象来验证访问。

应用程序/配置/ config.yml:

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                ...
            second_connection:
                ...

如果对象由默认连接管理,那么我需要检查并确保当前用户可以访问该连接“ACL”表中的该对象。或者,如果由second_connection管理,我需要检查连接“ACL”表。

我已经看了一遍如何做到这一点,但似乎无法找到它。如果它存在,我会想象它会是这样的:

的src /命名空间/包/资源/配置/ services.yml:

services:
    security.access.report_bundle_voter:
        class:      Namespace\Bundle\Security\Voter
        public:     false
        arguments: ["@doctrine"]
        tags:
            - { name: security.voter }

的src /命名空间/捆绑/安全性/ Voter.php:

...
class Voter
{
    protected $doctrine;

    public function __construct($doctrine)
    {
        $this->doctrine = $doctrine;
    }

    ...    

    public function vote(...)
    {
        //Would return an instance of the entity manager responsible for that object
        $em = $this->doctrine->determineManger($object);

    }
}

1 个答案:

答案 0 :(得分:0)

通过学说来源api,我找到了一个有效的解决方案。实体管理器有一个方法contains($entity),它将检查给定的实体管理器是否管理该实体。

所以,从那以后,我不知道我需要做的是哪个经理是获取所有可用管理器的列表,遍历它们并检查它们是否包含$ entity。如果他们这样做,那么我会将其设置为投票人的实体经理。

的src /命名空间/包/资源/配置/ services.yml:

services:
    security.access.report_bundle_voter:
        class:      Namespace\Bundle\Security\Voter
        public:     false
        arguments: ["@doctrine"]
        tags:
            - { name: security.voter }

的src /命名空间/捆绑/安全性/ Voter.php:

class Voter implements VoterInterface
{
    protected $doctrine;
    protected $em;

    public function __construct($doctrine){
        $this->doctrine=$doctrine;
    }

    public function init($object)
    {
        //Gets all the known connections
        foreach($this->doctrine->getConnections() as $connName => $connInfo){
            //Initializes the EntityManager for this connection
            $em = $this->doctrine->getManager($connName);
            //Checks if this is the EntityManager that is managing the given object
            if($em->contains($object)){
                $this->em = $em;
            }
        }
    }
}