0

Laravel4で多言語 Web サイトを構築しています。

データベースには、複数の言語のシリアル化された値を含む「コンテンツ」という名前の列があります。例えば:

a:3:{s:2:"gb";s:15:"This is English";s:2:"es";s:5:"Hola!";s:2:"si";s:19:"Slovenija je zakon!";}

シリアル化された配列には次が含まれます。

  1. セッションから取得した言語の略語
  2. 入力フィールドからのコンテンツ

データベースに新しい言語を追加すると、新しいシリアル化された文字列が作成されます。すごい!しかし、その文字列をシリアル化解除して値を追加しようとすると、次のエラーが発生します。

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:データベースに値を追加するためにミューテーターを使用しています。

十分に明確であることを願っています。不明な点があればコメントいただければ修正します。
ありがとう!

4

1 に答える 1

0

わかりました、私はそれを修正することができました。コードを 2 回シリアル化解除していました。1 回はアクセサーで、もう 1 回はミューテーターでです。これが実際の例です:

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');
    }
于 2013-09-23T20:43:05.023 に答える