我有一个使用多个实体管理器的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);
}
}
答案 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;
}
}
}
}