2017-06-17 43 views
-2

这是一个Symfony 3项目。如何在用户实体中使用Symfony参数

在用户实体中,我需要实现方法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; 
} 
+2

你不应该把这种逻辑变成实体。改用原则事件。 – malcolm

+0

看来我无法从'LifecycleEventArgs'访问容器。 – user3429660

+0

我的意思是'preUpdate','postUpdate','preLoad'etc ... – malcolm

回答

0

为什么不向组件的实体添加组标签?因此,作为马尔科姆说,你不应该接触的EntityManager,从你的实体内,这个逻辑是不正确放置,你可以做...

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; 
} 
0

也,你不应该从你的实体

(你COULD

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

读取里面parameters.yml但你真的不应该使用上述方法

(你也可以给用户实体添加常量......)

相关问题