2012-03-16 14 views
5

symfony2では 'Employee'エンティティで他のエンティティとのマッピングが多く含まれているため、私のプロジェクトのエンティティ。私のマッピングのいくつかは次のようになります:例外:Symfony Component Security Core Authentication Token UsernamePasswordToken :: serialize()は文字列またはNULLを返す必要があります

/** 
    * @var EmployeeDesignation 
    * 
    * @ORM\ManyToOne(targetEntity="EmployeeDesignation") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="employee_designation_id", referencedColumnName="id") 
    * }) 
    */ 
    private $employeeDesignation; 

    /** 
    * @var EmployeeDesignation 
    * 
    * @ORM\ManyToOne(targetEntity="EmployeeType") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="employee_type_id", referencedColumnName="id") 
    * }) 
    */ 
    private $employeeType; 

認証はマッピングなしで問題なく動作します。私が試してみました

You cannot refresh a user from the EntityUserProvider that does not contain an identifier. The user object has to be serialized with its own identifier mapped by Doctrine. 

:私は上記の方法を行った後、次のエラーを取得しています

class Employee implements AdvancedUserInterface, \Serializable{ 
    /** 
      * serialize the username 
      * @return serialize 
      */ 
      public function serialize() { 
       return serialize($this->emailOfficial); 
      } 

      /** 
      * unserialize 
      * @param $data 
      */ 
      public function unserialize($data) { 
       $this->em = unserialize($data); 
      } 

:私は「シリアル化()」と「アンシリアライズ()」以下のようなことでメソッドを試してみましたようであるように、前のエラーを取り除くために、この方法は、以下のとおり

Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::serialize() must return a string or NULL 

だから、誰もがこの問題から克服する方法を提案してくださいすることができますか?

答えて

19

私は似たようなことに遭遇しましたが、いくつかの研究の後、私はあなたと同じことを試みました。

しかし、ある時点で、__sleepメソッドを設定すると、すべて正常に機能することがわかりました。

 
class User implements PlayerInterface 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 
... 

    public function __sleep() 
    { 
     return array('id'); 
    } 
... 
  • @ORM\Idとして定義されているフィールドが返される配列の一部であることを確認してください。
  • ブラウザクッキーはセッションを使用しているので、必ず削除してください。

新しい関連付けを設定するときには、これを原因と理由を正確に私は(私は、多対多でした)分かりませんが、それはおそらく、この場所から発信:これは誰かを助けることができる

 
// see Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse() 
... 
     $event->getRequest() 
      ->getSession() 
      ->set('_security_'.$this->contextKey, serialize($token)); 
... 

希望を。

編集:

参考文献:

+0

ありがとうございました!!!非常に役立ちます! – Ben

+0

私は多くの時間をデバッグしてくれました。ありがとうございます。 –

+1

ユーザーエンティティがユーザーにリンクする関係を持っている場合、このエラーメッセージが表示されると思います。例: 'User-> Article-> Author'(' User'には多くの 'Articles 'Article'は著者として' User'を持っています)、シリアライゼーションは失敗します。なぜ、プライマリ・キー(id)だけを使って 'User'を直列化すると、すべてのことが正しく行われます。だから、 '__sleep'関数を使ってそこに主キーを返します。 – Dmitriy

2

これだけ働いた:あなたは

「保護」に、ユーザーに関連付けられているエンティティのすべてのプロパティの可視性を確認する必要があります参照してください

class User implements UserInterface

class User implements UserInterface, \Serializable

と次のメソッドを追加する必要がありましたUserクラスに:

public function serialize() { 
    return serialize($this->username); 
} 

public function unserialize($data) { 
    $this->username = unserialize($data); 
} 
0

あなたはユーザークラスのすべての変数に「保護」に置く必要があります。少なくとも仕事のために:)

関連する問題