2017-01-20 11 views
0

私は3つのテーブルを持っている:プロフィール - 許可 - ProfilePermissionValueをドクトリン - 自動挿入行の関連テーブル

プロファイルと許可は、古典的なエンティティであり、そしてProfilePermissionValueはProfile.id、Permission.idの関連性、および余分なフィールドであり、プロファイルのアクセス許可の値を表します。

私はPermissionを追加するときに、ProfilePermissionValueに各行の新しい行を挿入します。 逆に同じですが、私は新しいプロファイルを追加します...そして、途中で削除しても同じです。

質問:Doctrine(Symfony 3)の機能を使用する方法はありますか、それとも自分でコードを作成する必要がありますか?

+0

はい、余分な列を持つ多対多の関係です:http://www.prowebdev.us/2012/07/symfnoy2-many-to-many-relation-with.html – DOZ

+0

これは実際には何ですか注文には商品があるかどうかわからないので、私のプロファイルには本当に必要なすべての権限が永久に必要です。 – Flozza

+0

ProfilePermissionValueエントリにはどの値を設定できますか? – lxg

答えて

1

あなたはより厳密にあなたが必要とする許可< - >プロフィールを見ると思います。基本的にほとんどの場合、私が協力してくれたほとんどの場合、何かが許可されていないと、許可されていない(または許可されていない何かが許可されていれば、より危険です)という前提がありました。データの量を大幅に削減するため、保存する必要があります。

あなたはこの

<?php 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
*/ 
class Permission 
{ 

    // id column 

    /** 
    * @ORM\Column(type="string") 
    * @var string 
    */ 
    private $name; 



    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

} 

<?php 

use Doctrine\Common\Collections\Collection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
*/ 
class User 
{ 

    // id column 

    // name column 

    /** 
    * @ORM\ManyToMany(targetEntity=Permission::class) 
    * @ORM\JoinTable(name="allowed_permissions", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} 
    * ) 
    * @var Permission[]|Collection 
    */ 
    private $allowedPermissions; 



    /** 
    * @return Permission[] 
    */ 
    public function getAllowedPermissions() 
    { 
     return $this->allowedPermissions->toArray(); 
    } 

} 

のようなあなたのエンティティを作成するときだから、単に持っていることのいずれかのニーズなし

<?php 

use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; 

class Authorizator implements AuthorizationCheckerInterface 
{ 

    /** 
    * @param string $name 
    * @param User $user 
    * @return bool 
    */ 
    public function isGranted($name, $user) 
    { 
     foreach ($user->getAllowedPermissions() as $permission) { 
      if ($permission->getName() === $name) { 
       return TRUE; 
      } 
     } 

     return FALSE; 
    } 

} 

としてインターフェイスAuthorizationCheckerInterfaceための独自のクラスを実装することができますデータベースのアクセス権を拒否します。

関連する問題