Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

PHPマイクロフレームワークのSlimを触ってみた

SlimSinatraに影響を受けたPHPのマイクロフレームワークです。マイクロフレームワークがじわじわ流行っていると聞いて試しに触って見ることにしました。

環境

参考資料

導入

Composerでインストールできます。ちなみにPHP >= 5.3.0じゃないと動かないようです(少なくともSlim 2系は)。

% cd path/to/project
% curl -s https://getcomposer.org/installer | php

composer.jsonを作成します。

{
  "require": {
    "slim/slim": "2.*"
  }
}

このコマンドでインストールします。完了するとvendorディレクトリにslimのソースが格納されます。

% php composer.phar install

ディレクトリ構成はこのようにしました。こうしたらいいよ、っていう案があれば@TAKAyuki_atkwskにコメントお願いします。

project/
    composer.json
    composer.lock
    composer.phar
    public/          # ドキュメントルート
        .htaccess    # Slimライブラリからコピー
        index.php    # Slimのメインファイル
    templates/       # テンプレートディレクトリ
        index.php
        hello.php
    vendor/
        slim/slim/   # Slimライブラリ

アプリケーションの設定

設定はindex.phpで行います。Slimクラスのオブジェクトを生成するときの引数として設定を渡します。今回はデバッグモードとテンプレートパスについての設定を行なっています。詳しくはSettings – Slim Framework Documentationに書いてあります。

<?php
require "../vendor/autoload.php";
    
$app = new \Slim\Slim(array(
    "debug" => true,
    "templates.path" => "../templates"
));

ルーティング

特定のURIについて各HTTPメソッドでアクセスされたときの処理を書きます。例えば/にGETメソッドでアクセスした時の処理をこのように書くとします。/にアクセスすると、Hello, world!と表示されます。

$app->get("/", function () {
    echo "Hello, world!";
);

アプリケーションの起動

$app->run()でアプリケーションを起動します。設定やルーティングを行った後に書くのがいいと思います。

簡単なサンプルアプリを作った

実際に動くものを作ってみました。名前を入力すると、「Hello, 名前」と表示するアプリです。細かいところは気にしていないので、あしからず。

public/index.php

<?php
require "../vendor/autoload.php";

$app = new \Slim\Slim(array(
    "debug" => true,
    "templates.path" => "../templates"
));

$app->get("/", function () use ($app) {
    $app->render("index.php");
})->name("home");

$app->post("/hello/", function () use ($app) {
    $req = $app->request();
    $name = $req->post("name");
    $app->render("hello.php", array("name" => $name));
})->name("hello");

$app->run();

templates/index.php

<!DOCTYPE html>
<html>
    <head>
        <title>slim sample</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>slim sample</h1>
        <p>please input your name</p>
        <form action="/hello/" method="POST">
            <input type="text" name="name" value="">
            <input type="submit" name="submit" value="submit">
        </form>
    </body>
</html>

templates/hello.php

<!DOCTYPE html>
<html>
    <head>
        <title>hello!</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>Hello, <?php echo htmlspecialchars($name, ENT_QUOTES, "UTF-8"); ?></h1>
        <footer>
            <a href="/">return to HOME</a>
        </footer>
    </body>
</html>

画面はこんな感じ。

/ (home) 画面

/hello/ 画面

感想

さらっと触っただけですが、手軽にWebアプリを作るには適していると思いました。同じ事をCakeでやろうとすると、もっとファイル数が多くなってゴテゴテすると思うし、フルスクラッチでやろうとするとファイルの中身がもうちょっと複雑になるのかなと思います。今回は本当に小規模なサンプルでしたが、もうちょっとページ数が増えてくるとSlimの恩恵を受けられるのかなという気がします。あと、DB使うときはCakeのModelクラス的なものがないので、工夫が必要そうです。それと元ネタとなったSinatraと比較してみたいです。