【问题标题】:How to use Symfony parameters in User Entity如何在用户实体中使用 Symfony 参数
【发布时间】:2017-06-17 20:16:38
【问题描述】:

这是一个Symfony 3 项目。

在用户实体中,我需要实现方法getRoles()。我有一个私有成员$roles,它是一个数组,我将它添加到serializeunserialize 方法中。

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


【解决方案1】:

正如马尔科姆所说,您不应该从您的实体内部触摸 EntityManager,因为该逻辑正确放置。

另外,您不应该从实体内部读取 parameters.yml

(你可以

use Symfony\Component\Yaml\Yaml;
$value = Yaml::parse(file_get_contents('/path/to/file.yml'));

但你真的不应该使用上述方法

(您也可以向用户实体添加常量...)

【讨论】:

    【解决方案2】:

    为什么不向您的 Membership 实体添加组标签?所以你可以这样做......

    public function getRoles() {    
        $roles = ['ROLE_USER'];
        foreach ($this->memberships as $m) {
             if ($m->getGroupRole() == 'ROLE_SUPPORT') 
                 array_push($roles, "ROLE_SUPPORT");
    
             if ($m->getGroupRole()) == 'ROLE_ADMIN') 
                 array_push($roles, "ROLE_ADMIN");
        }
        return $roles;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多