Sliex のエクステンションを作ってみた
PHP のマイクロフレームワークの本命だと思われる Silex を少し触っていて、簡単にエクステンションが書けそうだったので作ってみた。
Zend Framework のバリデーションライブラリを簡単に使用できるようにした。
GitHub - heavenshell/php-silex-zf-validate: Silex Zend Validate extension
とりあえずサンプルコード。
include_path に Zend Framework の library を置く必要がある。
<?php require_once 'silex.phar'; require_once dirname(__DIR__) . '/src/Zf1/ValidateExtension.php'; $zendpath = '/Path/To/IncludePath'; $app = new Silex\Application(); $app->register(new \Zf1\ValidateExtension(), array( 'zend.class_path' => $zendpath, )); $app->get('/', function () use ($app) {}); $app->get('/alnum', function () use ($app) { $validator = $app['zend.validate']('alnum'); $result = $validator->isvalid('abcd12+-'); $messages = $validator->getMessages(); return $messages['notAlnum']; })
$app['zend.validate']('alnum'); の第一引数にバリデーションのライブラリ名を書く。
第二引数にはバリデーションライブラリのコンストラクタに渡す値を設定する。
一通り Zend_Validate_* のコンストラクタを見た所、引数が 1 つか配列で渡す形だったので多分問題なさそう。
このままだと、エラーメッセージは英語のままなので、メッセージを翻訳したい場合は、以下のように設定する。
<?php require_once 'silex.phar'; require_once dirname(__DIR__) . '/src/Zf1/ValidateExtension.php'; $zendpath = '/Path/To/IncludePath'; $resouce = __DIR__ . '/resouces/Zend_Validate.php'; $message = __DIR__ . '/resouces/Messages.php'; $app = new Silex\Application(); $app->register(new \Zend\ValidateExtension(), array( 'locale' => 'ja', 'zend.class_path' => $zendpath, 'zend.resouce_path' => $resouce, 'zend.extra.resources' => array($message) )); $app->get('/alnum', function () use ($app) { $validator = $app['zend.validate']('alnum'); $result = $validator->isvalid('abcd12+-'); $messages = $validator->getMessages(); return $messages['notAlnum']; });
register() を呼ぶ際に 'zend.resouce_path' に翻訳ファイル(リソース)へのパスを設定する。
デフォルトのメッセージが気に食わない場合は、自分で定義したメッセージファイルで上書きできる。
# 設定しない場合は、デフォルトを使用する
'zend.extra.resouces' には文字列または配列を設定する。
感想
一番ハマったのが Zend Framework のライブラリをオートロードする所だった。
あと、テストコードを書いていて気になったのが、WebTestCase を使用した場合、なぜか必ず '/' をディスパッチするよう。
まぁとりあえずダミーのルーティングを書いてやれば行けた。
それ以外は割と簡単に書けた。
Flask みたいに色々エクステンションが増えればいいと思う。
え、バリデーションライブラリはデフォルトであるじゃないかって?
(∩゚Д゚) アーアー キコエナーイ