2013年4月4日木曜日

limonadeをちょろっと入門してみた(ルーティング編)


ちっちゃいツールを作るのにわざわざcakeとかfuelとかgit cloneするのめんどいなーと思ったので、
最近流行り?のmicro framework?であるlimonadeとやらのreadme.mdを意訳してみた。
ちなみに、limonade知ってる具合としては、名前だけ聞いたことある具合。公式ページも見たことない。


これが公式ページ。
http://limonade-php.github.com/と思ったけどgithubぱっと見、最近ほとんどコミット無いじゃん…
保守されてるか心配だけどまぁいっか…

githubのREADMEをゆるっと意訳してみる
https://github.com/sofadesign/limonade

うっす、とりあえずgithubから最新をゲットする。
$ git clone --depth=1 https://github.com/sofadesign/limonade.git$ rm -fr .git
他のいらないファイルは後で消す。

ルーティング


とりあえずハローワールド。こんなん。
require_once 'lib/limonade.php';
dispatch('/', 'hello');
function hello()
{
    return 'Hello world!';
}
run();

ルーティングではdispatch()が主役。
dispatch()は、
  • どのHTTPメソッドの(デフォルトだとdispatch_get)
  • どのURLが(/)
  • どの関数にひもづいてるか(hello())
を表してる。

URLは以下の様な形式。mod_rewriteとか使えば、もっとかっこいい形にできる系かな(とか思ってたら、もっと後ろのほうにそういう説明があった)。
http://localhost/my_app/?u=/my/path
http://localhost/my_app/?uri=/my/path
http://localhost/my_app/index.php?/my/path
http://localhost/my_app/?/my/path

form内でHTTPのメソッドをとかで自由に変えたいときは、以下のようにでPOSTを任意にオーバーライドできる。
<input type="hidden" name="_method" value="PUT" id="_method">
URLのパターンに、パラメータも含められる。params()でアクセスする。
dispatch('/hello/:name', 'hello'); 
function hello()    {
    $name = params('name');
    return 'Hello $name'; 
}

ワイルドカードもばっちり。それもparams()でアクセスできる。
dispatch('/writing/*/to/*', 'my_letter');
function my_letter()
{
    # /writing/an_email/to/joe と一致
    $type = params(0); 
    # "an_email"
    $name = params(1);
    # "joe"
    # ...
}
dispatch('/files/*.*', 'share_files');
function share_files()
{
    # /files/readme.txt と一致
    $ext = params(1);
    $filename = params(0).".".$ext;
    # ...
}

「**」で、 /を含むワイルドカード。
dispatch('/files/**', 'share_files');
function share_files()
{
    # Matches /files/my/own/file.txt
    $filename = params(0);
    # my/own/file.txt
}

先頭に「^」をつければ、正規表現的に書ける。
dispatch('^/my/own/(\d+)/regexp', 'my_func');
function my_func()
{
    # /my/own/12/regexp  と一致
    $num = params(0);
} 

ワイルドカードや正規表現部に名前をつけたり…
dispatch(array('/say/*/to/**', array("what", "name")), 'my_func');
function my_func(){
    # /say/hello/to/joe と一致
    $what = params('what');
    $name = params('name');
} 

パラメータのデフォルト値を決めたり。
$options = array('params' => array('firstname'=>'bob'));
dispatch('/hello/:name', 'hello', $options);
function hello($firstname, $name)
{
    return 'Hello $firstname $name';
}
 まぁ大体そんな感じ。
続きの意訳はいつかやろう。