Routing

PachiraにはMVCに置けるControllerがなく、 Sinatra Likeなルーティングでアプリケーションを開発していきます。

通常は、application/app/routers/に任意の名前でPHPファイルを配置し、bootstrap.phpからadd_routerで追加します

get($path, $callback)

get関数を使うと、GETメソッドのルーティングを定義することができます。 PATH_INFOと$pathが一致した時に$callbackが呼ばれますが、複数該当する場合は、最初にマッチしたルーティングだけ実行されます。

get("/", function(){
  view("index");
});

get("/about/", function(){
  view("about");
});

$pathは、正規表現を受け付けることができます。ワイルドカードや名前付きパラメータには対応していません。

get("/article/([\d+])", function($id){
  $article = Article::load($id);
  if(!$article) not_found();

  view("article/detail", ["article" => $article]);
});

post($path, $callback)

POSTもGETと同様に定義可能ですが、Serviceを推奨しています。

post("/article/update", function(){
});

request($path, $callback)

RESTなど、他のHTTPメソッド受け付けたい場合は、request関数を使います。

request("/", function(){
  switch(Request::method()){
    case "GET": break;
    case "POST": break;
    case "PUT": break;
    case "DELETE": break;
    case "HEAD": break;
    default: 
  }
});

pass()

ルーティング内でpass()を呼ぶと、次にマッチするルーティングに飛ぶことができます。 以下は、ログインしていなかったらログイン画面へ、ログインしていたらadmin/以下を閲覧できるようにするサンプルです。

get("/admin/(.*)", function($path){
  if(!logged_in() && $path !== "login") redirect("login");
  view_var("current_user", current_user());
  pass();
});

get("/admin/login", function(){
  view("admin/login");
});

get("/admin/", function(){
  view("admin/index");
});