Archive

Archive for 4月, 2008

PEAR::Services_Yahoo_JP

4月 30th, 2008

PEAR::Services_Yahoo_JP
なんぞこれ

PHP

PHPマニュアルがバージョンアップ

4月 28th, 2008

関数リファレンスに親カテゴリができてた。

PHPマニュアルを眺めてたらPHP5.3、PHP6.0からの内容がいろいろ追加されてた。
名前空間
遅延静的束縛 (Late Static Bindings)

あとエラー例外のページも追加されてた。
ErrorException
前はこっそりあっただけなのに。
PHPの標準関数のエラーを例外エラーとしてthrowするのでtry-catchで楽です。

getMessage() . "\n";
}
echo "終了\n";
# 開始
# fopen() expects at least 2 parameters, 0 given
# 終了

例外といえばタイプヒンティング利用すれば処理もいろいろできます。

getMessage();
} catch (LogicException $e) {
    echo 'ロジック' . $e->getMessage(); }
# ロジック例外

PHP

Ethnaのフォーム定義をyamlで書く

4月 28th, 2008

アクションフォーム毎に設定とか糞なのでプロジェクトのアクションフォームに設定するように。
せっかくなのでプラグイン化。

yamlファイルはetc以下におくことにしました
元になるフォーム定義はこれ

    var $form = array(
        'login_id' => array(
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_TEXT,
            'name'          => 'ログインID',
            'required'      => true,
        ),
        'password' => array(
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_PASSWORD,
            'name'          => 'パスワード',
            'required'      => true,
        ),
        'login' => array(
        ),
    );

□1□ 1.{appid}/libにspycの0.3betaをインストール

□2□ {appid}/etcにアクションフォームのクラス名小文字.yaml(今回はsample_form_login.yaml)を作成

login_id:
  type: VAR_TYPE_STRING
  form_type: FORM_TYPE_TEXT
  name: ログインID
  required: true
password:
  type: VAR_TYPE_STRING
  form_type: FORM_TYPE_PASSWORD
  name: パスワード
  required: true
login:

□3□ {appid}/app/pluginに以下のファイルを作る
Lowtech_Plugin_Parser.php


 * @package Lowtech
 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
 * @version $id$
 */

/**
 * Lowtech_Plugin_Parser
 *
 * @author cockok 
 * @package Lowtech
 * @version $id$
 */
class Lowtech_Plugin_Parser
{
    /** @var object Ethna_Controller コントローラオブジェクト */
    var $controller;

    /**
     * Lowtech_Plugin_Parserのコンストラクタ
     *
     * @param object Ethna_Controller $controller コントローラオブジェクト
     * @access public
     * @return void
     */
    function Lowtech_Plugin_Parser(&$controller)
    {
        $this->controller =& $controller;
    }

    /**
     * Lowtech_Plugin_Parserのコンストラクタ
     *
     * @param string $path 対象のパス
     * @access public
     * @return Ethna_Error object
     */
    function load($path)
    {
        return Ethna::raiseError('override!');
    }
}
?>

Parser/Lowtech_Plugin_Parser.php


 * @license http://www.opensource.org/licenses/bsd-license.php The BSD License
 * @package Lowtech
 * @version $id$
 */

/**
 * spyc 0.3beta
 * http://spyc.sourceforge.net/
 */
if (substr(PHP_VERSION, 0, 1) >= 5) {
    require_once 'spyc/spyc.php5';
} else {
    require_once 'spyc/spyc.php';
}

/**
 * Lowtech_Plugin_Parser_Yaml
 *
 * @author cockok 
 * @package Lowtech
 * @version $id$
 */
class Lowtech_Plugin_Parser_Yaml extends Lowtech_Plugin_Parser
{
    /**
     * Lowtech_Plugin_Parserのコンストラクタ
     *
     * @param string $path 対象のパス
     * @access public
     * @return mixed failed Ethna_Error
     */
    function load($path)
    {
        // ファイルの更新日時の取得
        clearstatcache();
        if (is_readable($path) === false
                || ($st = stat($path)) === false) {
            return Ethna::raiseNotice('fopen failed ' . $path);
        }
        $mtime = $st[9];
        // キャッシュキーの作成
        $key = md5($path);
        // キャッシュマネージャ
        $plugin =& $this->controller->getPlugin();
        $cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
        // 更新日時以降のキャッシュをチェック
        if ($cache_manager->isCached($key)
                && $mtime < $cache_manager->getLastModified($key)) {
            // キャッシュがヒット
            $r = $cache_manager->get($key);
        } else {
            // 有効なキャッシュが見つからなかった
            $r = Spyc::YAMLLoad($path);
            // データをキャッシュする
            $cache_manager->set($key, $r);
        }
        return $r;
    }
}
?>

□4□ コントローラの$plugin_search_appidsに利用するアプリケーションID(Lowtech)を追加

$plugin_search_appids = array(
    '{appid}', 'Lowtech', 'Ethna',
);

□5□ アクションフォームのコンストラクタをオーバーライド

    function {appid}_Form_Login(&$controller)
    {
        // yamlプラグイン
        $plugin =& $controller->getPlugin();
        $loader =& $plugin->getPlugin('Parser', 'Yaml');
        // form値の上書き
        $r = $loader->load(BASE . '/etc/' . strtolower(get_class($this)) . '.yaml');
        if (!Ethna::isError($r)) {
            $this->form = $r;
        }
        // type, form_typeの定数を補正
        $constants = get_defined_constants();
        foreach ($this->form as $name => $value) {
            foreach ($this->def as $k) {
                if (isset($value[$k]) && in_array($k, array('type', 'form_type'))
                        && array_key_exists($value[$k], $constants)) {
                    $this->form[$name][$k] = $constants[$value[$k]];
                }
            }
        }
        // オーバーライド
        parent::Ethna_ActionForm($controller);
    }

PHP

アクションフォームのフォーム値をyamlで書きたい!

4月 26th, 2008

アクションフォームのフォーム値をyamlで書きたいとは配列好きなので思ったことなかったのですが、PHP勉強会でEthnaの話題がでるということで半年振りくらいに触ってみる。
半年振りでも変わらないEthnaステキ!

yamlファイルはアクションと同ディレクトリに小文字ファイル名で。

これが元。

class Sample_Form_Login extends Sample_ActionForm
{
    /** @var    bool    バリデータにプラグインを使うフラグ */
    var $use_validator_plugin = true;

    /**
     *  @access private
     *  @var    array   フォーム値定義
     */
    var $form = array(
        'login_id' => array(
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_TEXT,
            'name'          => 'ログインID',
            'required'      => true,
        ),
        'password' => array(
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_PASSWORD,
            'name'          => 'パスワード',
            'required'      => true,
        ),
        'login' => array(
        ),
    );

1.lib以下にspycの3.0betaぶち込む
2.コントローラでrequire

/** アプリケーションライブラリのインクルード */
require_once 'Ethna/Ethna.php';
require_once 'Sample_Error.php';
require_once 'Sample_ActionClass.php';
require_once 'Sample_ActionForm.php';
require_once 'Sample_ViewClass.php';

require_once 'spyc/spyc.php';
//require_once 'spyc/spyc.php5';

3.アクションと同位置にファイル名.yaml(今回はlogin.yaml)を作成

login_id:
  type: VAR_TYPE_STRING
  form_type: FORM_TYPE_TEXT
  name: ログインID
  required: true
password:
  type: VAR_TYPE_STRING
  form_type: FORM_TYPE_PASSWORD
  name: パスワード
  required: true
login:

4.アクションフォームのコンストラクタをオーバーライド

    function Sample_Form_Login(&$controller)
    {
        parent::Sample_ActionForm($controller);

        $yaml_path = dirname(__FILE__).DIRECTORY_SEPARATOR.strtolower(substr(basename(__FILE__), 0, -3)).'yaml';

        // キャッシュマネージャ
        $plugin =& $this->backend->getPlugin();
        $cache_manager =& $plugin->getPlugin('Cachemanager', 'Localfile');
        // キャッシュKeyの設定
        $cache_key = md5($yaml_path);
        // このKeyに対する有効なキャッシュの確認
        if ($cache_manager->isCached($cache_key)) { // キャッシュがヒット
            $this->form = $cache_manager->get($cache_key);
        } else { // 有効なキャッシュが見つからなかった
            $this->form = Spyc::YAMLLoad($yaml_path);
            // 省略値補正
            $constants = get_defined_constants();
            foreach ($this->form as $name => $value) {
                foreach ($this->def as $k) {
                    if (isset($value[$k]) == false) {
                        $this->form[$name][$k] = null;
                    }
                    // type, form_typeの補正
                    if (isset($value[$k]) && in_array($k, array('type', 'form_type'))
                            && array_key_exists($value[$k], $constants)) {
                        $this->form[$name][$k] = $constants[$value[$k]];
                    }
                }
            }
            // データをキャッシュする
            $cache_manager->set($cache_key, $this->form);
        }
    }

PHP

PHPのyamlパーサ

4月 26th, 2008

PECL::syck
いつの間にかPECL入りしてた。
Cライブラリなので速度は速いがbetaだったり、windowsバイナリは配布されていなかったり、PECLコマンドでコンパイルできなかったり。

spyc
ピュアPHPなので遅い。
syckと挙動が異なったりする。

sfYaml
Symfony1.1系のライブラリ。
もともとはspycを利用していたが、自前で準備&syckの関数があったらそちらを使う。

sfYaml触ってみたけど、symfonyで利用する上で問題ないだけなレベルでyamlパーサとしてはまともに利用できませんでした。
ex.

True: true
# [1] => boole(true)
- name: yotsuba
  age: 14
# InvalidArgumentException

PHP