それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Slim php フレームワークの使い方

CakePHPfuelPHP とか Litiumuとか symfony とか zendFrameworkとか。。。全部入りのPHPフレームワークは色々と面倒だしやり方覚えるのが面倒だし。ぶっちゃけPHPとかjson返すだけでいいんだし。シンプルなモノほしいなってことで Slim を愛用しています。

Slim は RubySinatra のような軽量フレームワークです。

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のようなガッツリした処理ってほんとうに必要なのか、いつも疑問に思ってる。

JavaServletのような動作をしたいフレームワークmojavi 以降いっぱいあるけど、PHPはもっとシンプルでいいと思うんですよ。 javaRubypython はそもそもHTTPリクエストを処理する機構がなかったので、wsgi とか rack とか ServeletAPIが必要とされたんだろうし。

参考資料

http://demouth.hatenablog.com/entry/2014/02/14/020951