2017-06-17 36 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但你真的不應該使用上述方法

(你也可以給用戶實體添加常量......)

相關問題