はじめに

Webアプリの開発にはもはや欠かせない存在であるフレームワーク。

その中でも軽量PHPフレームワークとして人気の高いSlimについて、特徴や使い方をわかりやすく説明します。


Slimフレームワークの特徴

軽量フレームワークである

Slimの最大の特徴は「軽量フレームワーク」であることです。ではこの「軽量」とはどういうことでしょうか。

有名なCakePHPLaravelといったフレームワークは「フルスタックフレームワーク」と呼ばれ、多くの機能を持っているのが特徴です。

これに対し、Webアプリに必要最低限の機能だけを持ったものを「軽量フレームワーク」または「マイクロフレームワーク」と呼びます。

フルスタックフレームワークでは様々な機能が簡単に呼び出せるため、仕様がアプリ設計とうまく合っていれば高速開発のために大いに役立つでしょう。

しかし、フレームワークが多機能であればあるほど、身動きが取りづらくなるのも事実です。

アプリ設計と合わない部分を自身で追加実装したり機能変更したりする際に、フレームワーク側のルールに従わなければならず余計に時間がかかることもあります。

その点、Slimは最小限の機能のみを持つため、ルールがシンプルで、開発の自由度が高いのです。


学習コストが低い

用意されている膨大な量の機能やルールを覚えるのにも相応の時間がかかるため、フルスタックフレームワークでは学習コストが高くなりがちです。

Slimをはじめとする軽量フレームでは、機能やルールが少なくシンプルであるため、学習コストが低いうえ、追加実装で手間取ることもありません。

加えて、自身で書くコードの割合が増えることで「今何をやっているのか」がわかりやすくなります。

玄人に人気の高いフレームワークではありますが、これらの理由から、実はWebアプリ開発初心者にこそおすすめです。

Slimは数ある軽量フレームワークの中でも最も知名度が高くユーザー数も多いため、Web上のドキュメントが充実しているのもメリットです。


PSRに準拠

PSRとは「PHP Standard Recommendations」の略で、PHP-FIG(PHP Framework Interop Group)により策定されたルールです。

なお、PHP-FIGという団体は、PHPコミュニティの発展を目標に著名なPHPフレームワークやライブラリの代表者が集まって結成されました。

ルールといっても必ず守らなければならないものではなく、PHPでより洗練されたコードを書くためのコーディング規約集と考えてください。

Slimはこのルールのうち、HTTPリクエストおよびレスポンスの実装に関するルールであるPSR-7に準拠しています。

このため、Slimを使ってコーディングしていれば、他のPSR準拠フレームワークやアプリに対して理解スピードが上がるのです。

PSRについてはPSR-7だけでなく他にも多くのルールがあるので、PHPを使った開発に携わる機会が多い方は一読しておくとよいでしょう。

PHP Standard Recommendations(PHP-FIGサイト)


Slimフレームワークの機能

軽量フレームワークであるため、そこまで機能は多くありませんが、Slimでどのようなことができるのか見ていきましょう。


HTTPルーティング

Webアプリの肝は、クライアントからのリクエストに対し適切なレスポンスを返すこと、すなわちHTTPルーティングです。

Slimは必要最低限の機能のみを持つと先述しましたが、それがまさにこのことを指します。

シンプルで動作も速いため、WebアプリだけでなくAPIの実装に取り入れられることも多いようです。


エラー処理

どんなに注意深くコーディングしても、想定外のエラーは発生するものです。

Slimにはエラー発生時に例外処理をしてくれるエラーハンドラー機能が備わっています。

システムエラーハンドラー、404 Not Foundハンドラー、405 Not Foundハンドラー、PHPランタイムエラーハンドラーが標準搭載です。

また、これらに手を加えて独自の例外処理をすることもできます。


依存性注入(DI)

クラスの依存関係を解消するため、実行時に外部からインスタンスを与えることをDI(Dipendency Injection)パターンといいます。

Slimに標準実装されているDIコンテナはこのためのクラスで、PHPの代表的な依存性注入ライブラリであるPimpleベースです。

これを活用すればテストや仕様変更の効率がぐんと上がりますね。


他の軽量フレームワークとの比較

他にもPHPの軽量フレームワークは多く存在しています。Slimと比較し、他のフレームワークにはどのような特徴があるのでしょうか。

代表的な軽量フレームワークを見てみましょう。


Lumen

LumenはLaravelベースの軽量フレームワークです。Laravel機能のうちコアとなる部分はほとんど使えます。

Laravelへの移行が容易なので、最初は手軽なLumenで実装しておき、規模が拡大したらLaravelに移行するといった使用方法が可能です。

Lumen公式サイト


Flight

FlightはMITライセンスの軽量フレームワークです。

コード容量も超軽量で、コア部は50KB程度しかないため全て読むのにも時間がかかりません。

フレームワークの構造や仕組みを理解したい方には、コードを読みながら使用してみるのもおすすめです。

Flight公式サイト


Siler

PHPフレームワークの速度を比較するために、数多くのベンチマークテストが行われています。

そこで「最速」と名高いのがSilerです。

また、PSR-7のHTTPリクエストおよびレスポンス規約、PSR-15のミドルウェアパイプライン規約に準拠しています。

Siler公式サイト


Slimフレームワークのインストール

Windowsの場合

まずPHP関連のパッケージ管理ツールであるComposerを使いPHPをインストールします。

Composerのサイトからインストーラをダウンロードし、ダブルクリックしてインストールを進めてください。

Composerのインストールが完了したら、コマンドプロンプトを開いて次のように入力します。

「sample」の部分には任意のプロジェクト名を入れてください。

  1. mkdir sample
  2. cd sample
  3. php composer.phar require slim/slim:3.*
  4. mkdir -p src/public
  5. cd src/public
  6. php -S localhost:8080

ブラウザを開いてhttp://localhost:8000にアクセスしてみてください。

まだ何もアプリを作成していないため、Not Found Errorが表示されればまずは成功です。


MaxOS/Linuxの場合

ターミナルを開き、下記の手順でPHPとSlimのインストールを行います。「sample」の部分には任意のプロジェクト名を入れてください。

  1. curl -sS https://getcomposer.org/installer | php
  2. mkdir sample
  3. cd sample
  4. php composer.phar require slim/slim:3.*
  5. mkdir -p src/public
  6. cd src/public
  7. php -S localhost:8080

まだ何もアプリを作成していないため、ブラウザを開いてhttp://localhost:8000にアクセスすると404 Not Foundが表示されるのが正常です。


使い方①まずはHello World

まずはHello Worldを表示させてみましょう。src/public/index.phpを下記のように作成してください。

  1. <?php
  2. use \Psr\Http\Message\ServerRequestInterface as Request;
  3. use \Psr\Http\Message\ResponseInterface as Response;
  4. require ‘../vendor/autoload.php’;
  5. $app = new \Slim\App;
  6. $app->get(‘/’, function (Request $request, Response $response, array $args) {
  7. $response->getBody()->write(“Hello, World!”);
  8. return $response;
  9. });
  10. $app->run();

プログラムの流れとして、まず使う名前空間の宣言をした後、autoload.phpの読み込みをしています。

autoload.phpはそれらのクラスが実装されているファイル郡を読み込むために必要です。

次に、Slimアプリケーションの中心クラスであるAppのインスタンスを生成、HTTPのGETメソッドのルーティングを登録します。

最後にAppインスタンスのrun()メソッドを実行すると、アプリが実行されるのです。

http://localhost:8000/にアクセスし、”Hello World”が表示されれば成功となります。


使い方②ルーティング

使い方①でもGETメソッドの登録の箇所がありましたが、詳しいルーティングの方法をみてみましょう。

HTTPのGETメソッドをルーティングするには、Appクラスのget()メソッドを使用します。

先ほどのsrc/public/index.phpのget()部分を下記のように書き換えてください。

  1. $app->get(‘/hello/{name}’, function (Request $request, Response $response, array $args) {
  2. $name = $args[‘name’];
  3. $response->getBody()->write(“Hello, $name!”);
  4. return $response;
  5. });

今度はhttp://localhost:8080/hello/(任意の名前)にアクセスすると「Hello, (入力した名前)!」と表示されるはずです。

このget関数では第1引数にURL、第2引数にコールバック関数を入れ、指定URLにアクセスがあるとコールバック関数の中身を実行します。

このコールバック関数で取る引数は次の3つです。

  • 第1引数:ServerRequestInterfaceインスタンスが入り、HTTPリクエスト情報を保有
  • 第2引数:ResponseInterfaceインスタンスが入り、HTTPレスポンス情報を保有
  • 第3引数:配列インスタンスが入り、プレースホルダー用データを保有

プレースホルダーは、URL指定時に複数パラメタを入力できるようにするための仕組みです。

今回、http://localhost:8080/hello/の後に続けて「任意の名前」を入れて、コールバック内でそれを表示するようにしました。

例えばさらにその後「会社名」を入れて、コールバック内でさらに複雑な処理をすることもできます。

例えば「入力された名前」で「入力された会社名」に所属する人を名刺データベースから検索して電話番号とメールアドレスを表示する等です。


使い方③DIコンテナを使う

下記のコード例では、依存性注入(DI)のために用意されているDIコンテナを使用しています。

Appクラスが例えばMyServiceというクラスに依存しているとしましょう。

通常はAppインスタンスのコンストラクタ内でMyServiceインスタンスを生成します。

しかし下記の例では、Appインスタンスを生成する際に引数Containerインスタンスを渡していますね。

そして、Containerインスタンスの中にMyServiceインスタンスを保有しています。

DIコンテナインスタンスはインターフェイスとしての役割を持ち、後からMyServiceクラスを他のクラスに置き換えるのが容易になるのです。

  1. <?php
  2. $container = new \Slim\Container;
  3. $app = new \Slim\App($container);
  4. $container = $app->getContainer();
  5. $container[‘myService’] = function ($container) {
  6. $myService = new MyService();
  7. return $myService;
  8. };
  9. $app->get(‘/foo’, function ($req, $res, $args) {
  10. $myService = $this->get(‘myService’);
  11. return $res;
  12. });

 

参考になるチュートリアル

英文のみになりますが、公式サイトにチュートリアルが用意されています。


ざっくり全体の流れを俯瞰

First Application Walkthrough

インストールから初期設定、データベース接続の方法等、アプリ開発方法の概要が簡潔にまとめられています。


ルーティング詳説

本ページで紹介しきれなかった他のHTTPメソッドのルーティングについてもコーディング例が記載されています。

Routing Overview


まとめ

PHP軽量フレームワークとして人気の高いSlimについて、特徴や機能、使い方をご紹介しました。

フルスタックフレームワークの方が便利と思われていた方もぜひ一度お試ししてみてはいかがでしょうか。

最新情報については公式サイトもご確認ください。

Slim公式サイト