PHPマイクロフレームワークSlim利用時の設定とフォームのaction指定

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

としておいて、設定・試験中はログを見ながら作業するといいと思います。ログが膨大に出ちゃいますが、試験環境ならいいかと。

Leave a Reply

Your email address will not be published.