2017-05-07 2 views
0

私はいくつかの権限でユーザーモデルを拡張しました。Symfony Logged inユーザーはすべてのプロパティを持っていません

if($user instanceof UserInterface){ 
       // get the roles 
       $userRoles = $this->getEntityManager()->getRepository('BackofficeBundle:UserRoles')->findBy(
        array('userId' => $user->getId()) 
       ); 

       if(!empty($userRoles)){ 
        foreach ($userRoles as $userRole){ 
         $user->setRoles($userRole->getRole()); 
        } 
       } 

       // get the rights 
       $userRights = $this->getEntityManager()->getRepository('BackofficeBundle:UserRights')->findBy(
        array('userId' => $user->getId()) 
       ); 

       if(!empty($userRights)){ 
        foreach ($userRights as $userRight){ 
         $user->setRight($userRight->getActionRight()); 
        } 
       } 
      } 

すべてが正常であるとuserRightsが正しくsettedされています。私は私が必要とするすべてのものを取得していますし、私はユーザーオブジェクトのすべてを格納していますUserRepositoryで

。しかし、ときに私は/ホームページルートにリダイレクトとしてdefaultControllerでユーザーを取得しています:$ユーザーオブジェクトはもう権利を持っていない

$user = $this->getUser(); 

。ここで何が間違っていますか?ユーザーオブジェクトに余分なものを置くことはできませんか?

- EDIT ---私も、ユーザオブジェクトがセッションに保存することができますので、権利をシリアル化しようとしている

:symfonyのDOKUで

public function serialize() 
    { 
     return serialize(array(
      $this->id, 
      $this->username, 
      $this->password, 
      $this->rights 
     )); 
    } 

    public function unserialize($serialized) 
    { 
     list (
      $this->id, 
      $this->username, 
      $this->password, 
      $this->rights 
      ) = unserialize($serialized); 
    } 

、彼らがいることを、説明しますすべてのビューで、DBから毎回ユーザーを取得します。しかし、彼らはどのように役割を管理していますか?ロールは、別のテーブルによってロールの乱れが行われるため、ユーザーオブジェクト内になくてもその都度存在します。

答えて

0

ユーザのエンティティでgetRolesメソッドを操作する必要があります。ユーザーのエンティティはセッションで永続化され、dbから取得および更新されます。

リポジトリでは、エンティティを編集するのではなく、dbから取得するだけです。

EDIT。 ヒント:モデルを編集して、oneToManyUserからUserRolesUserRightsに追加して、Userエンティティ内でgetRolesgetRightsを処理する必要があります。

+0

しかし、User Entityがセッション内で永続化されている場合、なぜwhith $ user = $ this-> getUser()になるのですか?ユーザオブジェクトを変更してログインした後、私がUserRepositoryに持っているのと同じ完全な別のオブジェクトですか? –

+0

私が権利をシリアル化しようとしましたが、何も起こりません:$このパブリック関数のシリアル化() { リターンにserialize(配列( ます$ this-> ID、 ます$ this->ユーザ名、 ます$ this->パスワードを、 - >権利 )); } パブリック関数のアンシリアライズ($直列化された) { リスト( ます$ this-> ID、 ます$ this->ユーザ名、 ます$ this->パスワード、 ます$ this->権利 )=アンシリアライズ($連載); } –

+0

明示的にしない限り、リポジトリからユーザーをフェッチしません。リポジトリでは、そのようなことを行うべきではありません。リポジトリでは、編集することなく取得するエンティティを選択するだけです。 – ste

関連する問題