Phalcon\Session\Adapter にマジックメソッドを追加

  • KJ
  • 2015-03-16 09:40

Phalcon バージョン 2.0 の Phalcon\Session\Adapter でセッションが書き込めていないという現象があったので修正しました。

Phalcon:2.0 にマージ済です。 Merge pull request #3347

挙動

修正前に挙動を確認します。

次のようなサンプルファイルを作成し、実行します。

test.php

<?php
$session = new Phalcon\Session\Adapter\Files();
$session->some = 'value';

このファイルの実行した時の期待値としては some キーのセッションが書き込まれていることなのですが、実際には書き込みがされていませんでした。

<?php
$session = new Phalcon\Session\Adapter\Files();
$session->set('some', 'value');

のように set メソッドを使用した場合はセッションに書き込まれます。

エラー原因

Phalcon\Session\Adapter のソースを確認してみると、プロパティにデータを書き込む際 __set() メソッドがなにも定義されていませんでした。

1.x 系の時は __set() メソッドは set() メソッドの alias になっています。

そのため、セッションオブジェクトのプロパティにデータを設定してもセッションには書き込まれないという現象が発生しているようでした。

対応

__set(), __get(), __isset(), __unset() といったマジックメソッドを実装させます。

これらは既に実装されているメソッドの alias になっていれば問題ないはずです。

  • __get() -> get()
  • __set() -> set()
  • __isset() -> has()
  • __unset() -> remove()

Zephir で alias とかの設定はできないようなので、それぞれのメソッドを実装します。

public function __get(string index)
{
    return this->get(index);
}

public function __set(string index, value)
{
    return this->set(index, value);
}

public function __isset(string index) -> boolean
{
    return this->has(index);
}

public function __unset(string index)
{
    return this->remove(index);
}

これでセッションオブジェクトのプロパティによるセッションデータの操作できるようになりました。