PEAR::Services_Yahoo_JP
PEAR::Services_Yahoo_JP
なんぞこれ
関数リファレンスに親カテゴリができてた。
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(); }
# ロジック例外
アクションフォーム毎に設定とか糞なのでプロジェクトのアクションフォームに設定するように。
せっかくなのでプラグイン化。
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);
}
アクションフォームのフォーム値を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);
}
}
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