【发布时间】:2017-06-17 20:16:38
【问题描述】:
这是一个Symfony 3 项目。
在用户实体中,我需要实现方法getRoles()。我有一个私有成员$roles,它是一个数组,我将它添加到serialize 和unserialize 方法中。
public function getRoles()
{
if (count($this->roles) == 0) {
$this->roles = { ... read from db ... };
}
return $this->roles;
}
我面临的一个问题是,在... read from db ... 部分,我必须使用来自parameters.yml 的一些参数。通常,$this->container->getParameter(...) 完成这项工作。不幸的是,我无法从实体访问容器。
我的问题是:如何从实体访问 parameters.yml? 我可以以某种方式注入所需的参数吗?
另一个问题是:我是否也需要序列化 $roles 还是应该在每次请求时读取它们?
--- 编辑 ---
在我看来,这个逻辑是正确的。
getRoles() 函数应该将用户角色获取到安全包。它通过查询私有成员和 ORM 关系来实现。唯一的问题是我需要确定某些组,因为它们在所有部署中都没有相似的名称。这就是为什么我需要parameters.yml。
这是来自用户实体的片段,它实现了AdvancedUserInterface。
public function getRoles() {
$ADMIN_GRP = "ADMIN_GROUP"; // I need this from parameters.yml
$SUPPORT_GRP = "SUPPORT_GROUP"; // I need this from parameters.yml
$roles = ['ROLE_USER'];
foreach ($this->memberships as $m) {
if ($m->getGroupId() == $SUPPORT_GRP)
array_push($roles, "ROLE_SUPPORT");
if ($m->getGroupId()) == $ADMIN_GRP)
array_push($roles, "ROLE_ADMIN");
}
return $roles;
}
【问题讨论】:
-
你不应该把那种逻辑放到实体中。改为使用教义事件。
-
看来我也无法从
LifecycleEventArgs访问容器。 -
我的意思是'preUpdate'、'postUpdate'、'preLoad'等...
-
抱歉格式错误,我忍不住: /** * @ORM\PostLoad() */ public function onPostLoad(LifecycleEventArgs $args) { $container = $args->... ? }
-
抱歉,我忘了给事件添加“监听器”,所以使用 Doctrine 事件监听器来实现“魔法”。
标签: symfony symfony-3.2