俺 Pedia

窓際エンジニア(仮)の日常

Slimフレームワークの利用(基本的な処理)

この記事は「低予算でも闘う企画担当者の為の鎮魂歌 Advent Calendar 2015」の7日目の記事です。
 
今回はマイクロフレームワークであるSlimの説明を行います。  
先日の紹介の際にも書きましたが、私がマイクロフレームワークであるSlimに求めるのはルーティングに関する機能、リクエストに関する機能、レスポンス及びビューに関する機能、そして拡張性を持たせる意味でフック処理やそれに類する機能でその他はそれぞれ必要に応じて個別のライブラリの導入で対応できれば特に不満はありません。
できるだけフレームワーク自体はシンプルでアプリケーションの開発を開始する時点で特別な準備を必要とせず直ぐに利用できることが望ましいです。また、企画担当者が作るプロトタイプの場合企画そのものが進行に合わせて変化する事も多く、序盤から設計と開発が依存しあうようなものは使い辛くなります。そういう点でもSlimは非常にシンプルで利用するだけであればモデルの設計も不要で仮に途中で実装方針が変わった場合も柔軟に対応する事が可能です。
 
もっともマイクロフレームワークと言いながらもWebアプリケーションとして主に利用する機能はその多くが標準で搭載されておりフルスタックフレームワークとの違いはマクロ的な機能の実装レベルの違いと考えても差し支えありません。
 

「Slim」の導入

Composerで簡単に導入できます。

[(username)@www ~/bin]$ composer require slim/slim

以上で完了です。 なお、Slimを利用するにはPHPのバージョンが5.3以上である必要があります。

「Slim」の基本的な使い方

それではSlimの基本的な使い方から紹介します。
もっともシンプルなコードは以下のようなコードでしょう。

<?php

require 'vendor/autoload.php';

$app = new \Slim\Slim();

$app->get('/', function () {
    echo "Application Root.";
});

$app->run();

このコードではルートパスへのアクセスがあった場合「Application Root.」とメッセージを返します。
Slimフレームワークで最もシンプルな利用方法はこのようなGETやPOSTのようなルーティングを定義しそれに応じた処理を記述する方法です。  
さてSlimアプリケーションは基本的には一つのスクリプトから成ります。
前述のコードが例えば「index.php」に記述されている場合、全てはその一つのファイルで処理が振り分けられます。
例えば次のようなコードの場合はどうでしょうか。

<?php

require 'vendor/autoload.php';

$app = new \Slim\Slim();

$app->get('/example', function () {
    echo "Example.";
});

$app->run();

例えば「example.com」というドメインでアプリケーションが公開される場合「/example」へのアクセスはどのようになるでしょうか。
 
答えは「http://example.com/index.php/example/」となります。
できれば「http://example.com/example/」でアクセスしたいですね。その場合はHTTPサーバ側のRewrite機能を使いましょう。
さくらのレンタルサーバであれば以下のような内容を「.htaccess」ファイルに記述し該当のアプリケーションディレクトリに配置します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

基本的にはサーバ側での対応はこれだけです。
あとは必要となる機能をファイルに記述するだけで簡単にアプリケーションを作成できます。
 
それでは実際に利用できる機能のうちもっとも基本的な機能を紹介します。

① ルーティングの定義

最も利用頻度の高いルーティングはGETやPOSTのようなメソッドのルーティングです。

<?php

require 'vendor/autoload.php';

$app = new \Slim\Slim();

$app->get('/', function () {
    echo "Application Root.";
});

$app->get('/example1', function () {
    echo "Example1.";
});

$app->post('/add/example2', function () {
    echo "Example2.";
});

$app->run();

このコードではGETメソッドで「/example1」パスにアクセスした場合と、POSTメソッドで「/add/example2」にアクセスした場合に対応したルーティングを記述しています。
何れの場合も単純にメッセージを返しているだけですが、このようにメソッドやパスに応じたルーティングを定義し処理する事が可能です。
GET及びPOST以外にもPUTやDELETEなどのメソッドにも対応していますのでRESTfulなAPIを実装する事も比較的容易に対応できます。

② パラメータの受取り

次に頻度が多いものとしてはパラメータの受取りでしょう。

<?php

require 'vendor/autoload.php';

$app = new \Slim\Slim();

$app->get('/item/:itemid', function ($itemid) {
    echo "ITEM ID : " . $itemid;
});

$app->post('/register/', function () use ($app) {
    $username = $app->request->post('username');
    echo "UserName : " . $username;
});

$app->run();

このコードではGETメソッドでパラメータとして「itemid」を受け取り出力し、またPOSTメソッドでは受け取ったパラメータの「username」を出力しています。
GETメソッドのパラメータはパスの構成通りに定義し受取り変数を指定する事でプログラム内で利用する事が可能です。
一方でPOSTメソッドのパラメータはuse句でSlimアプリケーションインスタンスである「$app」を受け渡し「 $app->request->post()」でアクセスする事が可能です。
なお、もしも「$_REQUEST」のようにメソッドを意識せずに利用したい場合は「$app->request->params()」を利用してください。

③ ビュー(レンダリング)の処理

Slimフレームワークでもビューの機能は準備されています。
使用する場合は本体と合わせてビューテンプレートも準備します。

■index.php

<?php

require 'vendor/autoload.php';

$app = new \Slim\Slim();

$app->get('/item/:itemid', function ($itemid) use ($app) {
    $app->render('item.html', array("itemid" => $itemid));
});

$app->run();

■item.html

<html>
<body>
<p>ITEM ID : <?php echo $itemid ?></p>
</body>
</html>

テンプレートフォルダはデフォルトではプログラムが配置されているディレクトリ直下の「templates」となりますので「item.html」を作成後配置する事で利用できます。
テンプレートを見てわかる通り記載内容はPHPプログラムそのものですので高度な使い方をする場合は別なテンプレートエンジンとの組み合わせが必要です。
もっともより高度な使い方を行う場合はフルスタックフレームワークの利用も検討が必要ですので一概にテンプレートエンジンに利用を必要とするものではありません。
テンプレートファイルのディレクトリの変更については初期化処理に関する説明の際に合わせて行いたいと思います。

さて初回はSlimアプリケーションのもっとも基本的な使い方を紹介しました。
次回はフック処理を含めもう少し高度な利用など引き続きSlimフレームワークの紹介を続けます。