『Webアプリエンジニア養成読本』を読みながら、PHPマイクロフレームワークであるSlimを使ってプログラミングしています。
Slimはルーティング中心のシンプルなフレームワークです。RubyのSinatraを参考に作られたらしい。Sinatraもそうですが、読んだり調べたりするだけだと、何が何やらさっぱりわからない・・・。書いてみて、あーそういうことかーとわかります。テンプレートエンジンTwig、データベース操作illuminate/Eloquentとの組み合わせで、MVCを実現できます。
SlimをApacheで利用する場合、mod_rewriteの設定が必要です。『Webアプリエンジニア養成読本』にはこの部分がすっぽりと抜けているので、わかりにくいです。
例えば、Apache本体で、
Alias /hoge/ "/var/www/http/hoge/htdocs/" <Directory "/var/www/http/hoge/htdocs/"> AllowOverride All Options All Order allow,deny Allow from all </Directory>
となっている場合、.htaccessは、
RewriteEngine On RewriteBase /hoge RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L]
とし、/var/www/http/hoge/htdocs/配下(index.phpと同じ場所)に置きます。
.htaccessのテンプレートは、Slimパッケージの中にあります。
index.phpは、
<?php $app = new \Slim\Slim(); $app->get('/', function () use ($app) { $app->render(“welcome.php”); }); $app->post('/post/login', function () use ($app) { $app->render(“login.php”); }); $app->run();
として、welcome.phpに、
<form action="post/login/" method="post">
とフォームを書いておけば、login.phpが呼び出されるかと思ったのですが、呼び出せませんでした。「404 Page Not Found」のエラーになってしまいました。
しばらくハマったのですが、そりゃそうです。formのaction指定に誤りがありました。
<form action="post/login" method="post">
というように、loginの後のスラッシュを消しておかなければなりません。そうしないとどこにもマッチせず、Not Foundになります。むろん、index.php側を「$app->post(‘/post/login/’, function ($app) {」と修正しても構いません。HTMLのフォームの記述と、Slimの記述と、両者を一致させる必要があります。
mod_rewriteは間違いも多いところなので、httpd.confとかに、
RewriteLog "/tmp/rewrite.log" RewriteLogLevel 9
としておいて、設定・試験中はログを見ながら作業するといいと思います。ログが膨大に出ちゃいますが、試験環境ならいいかと。