我正在用Laravel4建立一个多语言网站。
在数据库中,我有名为"content"的列,其中包含多种语言的序列化值。例如:
a:3:{s:2:"gb";s:15:"This is English";s:2:"es";s:5:"Hola!";s:2:"si";s:19:"Slovenija je zakon!";}
序列化数组包含:
- 语言缩写,取自会话
- 来自输入字段的内容
现在,当我向数据库添加新语言时,它会创建新的序列化字符串。伟大!但是当我想反序列化该字符串并向其中添加一个值时,我收到以下错误:
unserialize() [<a href='function.unserialize'>function.unserialize</a>]: Error at offset 0 of 30 bytes
知道发生了什么吗?我理解错误的含义,但它毫无意义,因为我确定数据库中的值是序列化字符串。
public function setContentAttribute($value)
{
$lang = (Session::has('my.locale') ? Session::get('my.locale') : Config::get('app.locale'));
/* Create new serialized string */
if(empty($this->content)) {
$data[$lang] = $value['content'];
$this->attributes['content'] = serialize($data);
/* Update values */
} else {
$data = $this->content;
$data = unserialize($data)
$data[$lang] = $value['content'];
$this->attributes['content'] = serialize($data);
}
}
PS:我正在使用突变器向数据库添加值。
我希望它足够清楚。如果有任何不清楚的地方,请发表评论,我会修复它。
谢谢!
好的,我已经设法修复了它。我两次反序列化我的代码 - 一次在访问器中,一次在突变器中。这是一个工作示例:
public function getVsebinaAttribute($value)
{
$data = unserialize($value);
$lang = $this->getLang();
if (!empty($data[$lang])) {
return $data[$lang];
} else {
return '# Value has not yet been added';
}
}
public function setVsebinaAttribute($value)
{
if (isset($this->attributes['vsebina'])) {
$data = unserialize($this->attributes['vsebina']);
} else {
$data = array();
}
$lang = $this->getLang();
$data[$lang] = $value;
$this->attributes['vsebina'] = serialize($data);
}
protected function getLang()
{
return Session::has('my.locale') ? Session::get('my.locale') : Config::get('app.locale');
}