2016-08-04 20 views
0

我試圖使用Symfony文檔here中描述的序列化/ userialize方法來登錄用戶。Symfony登錄序列化/反序列化不工作,無效字符串

當我在ContextListener中轉儲令牌並嘗試反序列化字符串時,我得到一個無效字符串的錯誤。

用戶名字段實際上是電子郵件字段。

UserEntity

/** 
* @ORM\Table(name="users") 
* @ORM\Entity(repositoryClass="XXX\UserBundle\Repository\UserRepository") 
* @ORM\HasLifecycleCallbacks() 
* @UniqueEntity("username") 
*/ 
class User extends AbstractEntity implements UserInterface, AdvancedUserInterface, \Serializable 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToMany(
    *  targetEntity="XXX\UserBundle\Entity\UserRoles", 
    *  inversedBy="users" 
    *) 
    * @ORM\JoinTable(
    *  name="users_user_role", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $roles; 

    /** 
    * @ORM\Column(name="password", type="string", length=64) 
    */ 
    protected $password; 

    /** 
    * @Assert\NotBlank() 
    * @Assert\Length(max=4096) 
    */ 
    protected $plainPassword; 

    /** 
    * @ORM\Column(name="enabled", type="boolean") 
    */ 
    protected $enabled = true; 

    /** 
    * @ORM\Column(name="locked", type="boolean") 
    */ 
    protected $locked = false; 

    /** 
    * @ORM\Column(name="expired", type="boolean") 
    */ 
    protected $expired = false; 

    /** 
    * @ORM\Column(name="expires_at", type="datetime", nullable=true) 
    */ 
    protected $expiresAt; 

    /** 
    * @ORM\Column(name="last_login", type="datetime", nullable=true) 
    */ 
    protected $lastLogin; 

    /** 
    * @ORM\Column(name="confirmation_token", type="string") 
    */ 
    protected $confirmationToken; 

    /** 
    * @ORM\Column(name="password_requested_at", type="datetime", nullable=true) 
    */ 
    protected $passwordRequestedAt; 

    /** 
    * @ORM\Column(name="credentials_expired", type="boolean") 
    */ 
    protected $credentialsExpired = false; 

    /** 
    * @ORM\Column(name="user_default_language", type="string") 
    */ 
    protected $userDefaultLanguage; 

//getters and setters 

public function isAccountNonExpired() 
{ 
    return $this->getExpired(); 
} 

public function isAccountNonLocked() 
{ 
    return $this->getLocked(); 
} 

public function isCredentialsNonExpired() 
{ 
    return; 
} 

public function isEnabled() 
{ 
    return $this->getEnabled(); 
} 

/** 
* @return string 
*/ 
public function serialize() 
{ 
    return serialize([ 
     $this->id, 
     $this->username, 
     $this->password, 
     $this->enabled, 
    ]); 
} 

/** 
* @param string $serialized 
*/ 
public function unserialize($serialized) 
{ 
    list (
     $this->id, 
     $this->username, 
     $this->password, 
     $this->enabled 
     ) = $this->unserialize($serialized); 
} 

當我嘗試登錄我沒有得到任何只是ERR_EMPTY_RESPONSE任何錯誤。但是當我從ContextListener::handle()方法獲得令牌並試圖反序列化它時,它說該字符串是錯誤的。

所以它與序列化到這樣做,但我不知道/明白我做錯了......

回答

1

沒有在你的問題足夠的信息,但我想這是多字節字符串的問題在那裏。檢查日誌,在nginx/apache日誌文件夾或app/logs文件夾中。或者您可以嘗試使用serialize/unserialize函數中的json_encode/decode函數代替serialize/unserialize函數。例如:

public function serialize() 
{ 
    return \json_encode([$this->id]); 
} 

public function unserialize($serialized) 
{ 
    list($this->id) = \json_decode($serialized); 
} 
+0

它的工作,謝謝。 –