CakePHP やfuelPHP とか Litiumuとか symfony とか zendFrameworkとか。。。全部入りのPHPフレームワークは色々と面倒だしやり方覚えるのが面倒だし。ぶっちゃけPHPとかjson返すだけでいいんだし。シンプルなモノほしいなってことで Slim を愛用しています。
Slim は Ruby の Sinatra のような軽量フレームワークです。
Slimのインストール
composer が便利です。
{ "require": { "slim/slim": "*" } }
composer install
Slim の使い方
<?php require 'vendor/autoload.php'; $app = new \Slim\Slim(array( 'debug' => true, 'log.level' => \Slim\Log::DEBUG, 'log.enabled' => true, 'cookies.encrypt' => true, //cookie )); // phpinfo ページ $app->get("/info", function() use ($app){ phpinfo(); })->name("info"); //リクエストディスパッチ $app->run();
これだけ。あとは
http://localhost/test/index.php/info
にアクセスすると phpinfo が表示される。
.htaccessの組合せ
pathinfo を使うのもあれなので、htaccessを使う
RewriteEngine ON RewriteBase /test #←状況によってかきかえ # index.phpに全部の処理を貼り付ける RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,NS,L] # 指定サブディレクトリ以下にアクセスを禁止 RewriteRule vendor/(.*) index.php/$1 [QSA,NS,L] RewriteRule templates/(.*) index.php/$1 [QSA,NS,L] RewriteRule var/(.*) index.php/$1 [QSA,NS,L]
GET/POST
あとは、URLの パスと、 get/ post の組合せでどんどん書いていける
$app->get("/", function() use ($app) { $app->render("index.tmpl.php", array() ); }); $app->run();
render 関数 で template/index.tmpl.php に引数を渡しで実行されてる。
$app->post("/", function() use ($app) { $app->render("index.tmpl.php", array() ); }); $app->run();
POSTの場合も同じ。
すこし古いPHP
すこし古いPHPでも、無理矢理に使うことは出来る。
function my_func (){ $app = \Slim\Slim::getInstance(); $app->render("run/index.tmpl.php")l } $app->get("/run", "my_func");
正直、php の古いバージョンをいつまでも使うのはどうかと思うんだけど。。
バージョンアップ無しは、セキュリティの観点からおすすめはしないけど。
404 ページ
404ページもカスタマイズ出来る。
<?php $app->notFound(function () use ($app) { $html = ""; if($app->config("debug")){ ob_start(); phpinfo( INFO_VARIABLES ^ INFO_ENVIRONMENT ); $html = ob_get_contents(); ob_end_clean(); } $app->render("404_not_found.php", array("dump"=> $html) ); });
404 の場合、phpinfoのリクエスト部分を出すようにしてみた。
GET の引数の代わりに パス(path)を使う
$app->get("/search/:words+", function($words) use ($app){ foreach( $words as $word ){ echo $word; } }
このように書けば、パスの部分が配列になって出てくる
/search/aaa/bbb/ccc => array( "aaa", "bbb", "ccc" );
あとは通常のプレーンPHPと変わらない。
$app->get("/name", function() use ($app) { session_start(); $_SESSION["name"] = "value"; echo $_SESSION; } );
フィルタ処理
認証などのフィルタ処理は、関数を事前実行するだけ。
function is_login(){ if( $_SESSION["is_login"] ){ return true; }else{ header("Location : /test/login"); } } $app->("/entry.new", "is_login" function() use ($app) { session_start(); $_SESSION["name"] = "value"; echo $_SESSION; } );
シンプルなものでいいんだよ。
php そのものに、PDO や $GET/$POST/$_SESSION といったデータベース管理やHTTPリクエスト処理が付いているので、CakePHPのようなガッツリした処理ってほんとうに必要なのか、いつも疑問に思ってる。
JavaのServletのような動作をしたいフレームワークは mojavi 以降いっぱいあるけど、PHPはもっとシンプルでいいと思うんですよ。 javaやRubyやpython はそもそもHTTPリクエストを処理する機構がなかったので、wsgi とか rack とか ServeletAPIが必要とされたんだろうし。