2017-01-12 97 views
1

在我的應用程序,我有用戶。 每個用戶都有一個角色(管理員,測試儀,...) 每個角色可以有多個權限(主頁視圖,contactpage視...)選擇實體限制與許多關係的深度

所以,我有一個多對多的關係

因爲我想從角色的權限和權限中獲得角色,我有雙向關係。

我想要的僅僅是選擇其角色

我的問題一個權限:當我得到許可,它就會用它與它的角色的權限的每個角色......

結果開始例如:

{ 
    "id": 4, 
    "nom": "Accès au backoffice", 
    "slug": "page-backoffice", 
    "role": [ 
    { 
     "id": 1, 
     "libelle": "Administrateur", 
     "permission": [ 
     { 
      "id": 3, 
      "nom": "Visualisation du stock global", 
      "slug": "page-visu-stock-global", 
      "role": [ 
      { 
       "id": 2, 
       "libelle": "Responsable d'exploitation", 
       "permission": [ 
       { 
        ....... 

我要的是:

{ 
    "id": 4, 
    "nom": "Accès au backoffice", 
    "slug": "page-backoffice", 
    "role": [ 
    { 
     "id": 1, 
     "libelle": "Administrateur", 
     "slug": "administrateur" 
    }, 
    { 
     "id": 2, 
     "libelle": "Responsable d'exploitation", 
     "slug": "responsable-exploitation" 
    }, 
    .... 

哪有我做到了嗎?

我的ORM文件關聯信息: Permissions.orm.yml:

manyToMany: 
    role: 
     targetEntity: Role 
     cascade: { } 
     fetch: LAZY 
     mappedBy: permission 
     inversedBy: null 
     joinTable: null 
     orderBy: null 

role.orm.yml:

manyToMany: 
    permission: 
     targetEntity: Permissions 
     cascade: { } 
     fetch: LAZY 
     mappedBy: null 
     inversedBy: role 
     joinTable: 
      name: role_permission 
      joinColumns: 
       - 
        name: role_id 
        referencedColumnName: id 
      inverseJoinColumns: 
       - 
        name: permission_id 
        referencedColumnName: id 
     orderBy: null 

感謝您的幫助

+1

你應該看看的[序列化基團](https://symfony.com/doc/current/components/serializer.html#component-serializer-attributes-groups )和[如何啓用它們](https://symfony.com/doc/current/serializer.html#using-serialization-groups-annotations)。希望它可以幫助你 – OlivierC

+0

使用序列化不會阻止教條獲取數據做循環權限>角色>權限>角色...我錯了嗎? –

+0

只有在需要數據時,您纔會進行懶讀取以獲取happend。事實是,你提交了你的對象作爲一個JSON,我認爲它被序列化爲一個API – OlivierC

回答

1

晴你不希望將您的實體一次曝光到您的api中,尤其是在將相關實體暴露給其他實體時。

序列化組允許你選擇你想在api中公開哪些屬性。通過這種方式,您可以避免在公開相關實體時(如暴露其權限的角色暴露其角色,將其權限暴露給無限以及更遠的用戶)進入深層。

Symfony有關於what are serialization groupshow to enable and use serialization groups的一些文檔。

-1

這裏是如何做到這一點的例子:

use JMS\Serializer\Annotation\MaxDepth; 

class User 
{ 
    private $username; 

    /** @MaxDepth(1) */ 
    private $friends; 

    /** @MaxDepth(2) */ 
    private $posts; 
} 

class Post 
{ 
    private $title; 

    private $author; 
} 

而對於控制器:

use JMS\Serializer\SerializationContext; 

$serializer->serialize($data, 'json', SerializationContext::create()->enableMaxDepthChecks()); 

注有序列化過程中大約20註解關鍵字「過濾器」的數據。

示例源:

http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#limiting-serialization-depth-of-some-properties

+0

儘管此鏈接可能回答此問題,但最好在此處包含答案的重要部分並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18441824) – Jobin