2012-07-20 24 views
5

Tôi có lớp Người dùng làm lớp cơ sở, sau đó tôi mở rộng Giáo viên từ lớp người dùng.Lỗi "không thể làm mới người dùng" với symfony2 và doctrine

Khi tôi cố gắng đăng nhập tôi nhận được lỗi này

Bạn không thể làm mới một người dùng từ EntityUserProvider rằng không chứa một định danh. Đối tượng người dùng phải được tuần tự hóa với mã định danh riêng được ánh xạ bởi Doctrine.

Tôi có serialize chức năng/deserialize trong user.php như tôi đã đương đầu mà từ FOSUserbundle

public function serialize() 
    { 
     return serialize(array(
      $this->password, 
      $this->salt, 
      $this->usernameCanonical, 
      $this->username, 
      $this->expired, 
      $this->locked, 
      $this->credentialsExpired, 
      $this->enabled, 
     )); 
    } 

Tôi không thể tìm thấy nơi mà tôi có thể kiểm tra lỗi. tôi bị mắc kẹt. hãy giúp

Trả lời

4

Từ số code của số EntityUserProvider.php có vẻ như bạn phải tuần tự hóa id của người dùng.

6
"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." 

Đây không phải là câu trả lời cho câu hỏi, nhưng nếu ai đó googles thông báo lỗi ở trên (như tôi đã làm) thì đây là lần truy cập hàng đầu. Và vì tôi đã tìm ra giải pháp của mình, tôi nghĩ mình sẽ chia sẻ.

Bạn sẽ gặp lỗi này nếu bạn xóa người dùng hiện tại khỏi cơ sở dữ liệu và sau đó thử chuyển hướng người dùng. (Mà có thể có vẻ như một sai lầm ngớ ngẩn, nhưng thông báo lỗi chắc chắn không phải là giúp đỡ!) Giải pháp là chỉ cần xóa phiên trước khi bạn chuyển hướng.

$this->get('security.context')->setToken(null); 
$this->get('request')->getSession()->invalidate(); 
+0

Cảm ơn bạn! Tôi đã có vấn đề chính xác đó; đã xóa đối tượng người dùng và cố gắng chuyển hướng lại đến trang đăng nhập và gặp lỗi ở trên. Googled thông báo lỗi và, thì đấy! Đã hạ cánh tại đây! Bạn đang nỗ lực tiết kiệm cho tôi nhiều hơn một tấn. –

+1

Chú ý: Đối với Symfony 2.6+ bạn phải sử dụng '$ this-> get ('security.token_storage')'. – hchr

0

Chỉ có vấn đề tương tự sử dụng class table inheritance, nó được gây ra bởi khả năng hiển thị trên các thiết lập id tài sản để private, vì vậy lớp trẻ không thể truy cập vào id, thay đổi này để protected giải quyết nó.

Các vấn đề liên quan