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 みたいに色々エクステンションが増えればいいと思う。


え、バリデーションライブラリはデフォルトであるじゃないかって?
(∩゚Д゚) アーアー キコエナーイ