フレームワークとSlim
この連載で紹介していくSlimは軽量フレームワークと言われています。Slimの公式サイトでは「a micro framework for PHP」と表現されています。では、何がどう「軽量」なのでしょうか。そもそも、フレームワークとは何なのでしょうか。そこから話を始めたいと思います。
フレームワークとは
フレームワークは、和訳すると「枠組み」や「骨組み」となります。非常に幅広い意味を持ち、「ビジネスフレームワーク」のように経営戦略や業務改善などの場面でも使われます。
プログラミングでは、差分開発の土台となるもの、と言えるかもしれません。PHPでもJavaでも、フレームワークを使わずにシステム開発行う場合、PHPの実行ファイル(Javaならばサーブレットクラス)に記述する内容は一連の流れに沿ったものになります。パターン化されていると言ってもいいでしょう。そういった処理パターンの中で、例えば、リクエストパラメータを取得したり、それらにバリデーション処理を加えたりします。また、最後にはHTMLを表示させる(JavaならばJSPに処理を移管する)といった処理も記述します。
これらは定型的な処理であり、実際にコーディングしていくと、正直面倒くさいと思ったことがあると思います。これらの定型処理は、ほぼ似たような処理にも関わらず、全く同じコードにはなりません。たいていは以前に書いたものをコピー&ペーストして、書き換えることで省力化を図ります。とはいえ、それでも面倒くさいのは確かな上、書き換え忘れによるバグが発生するリスクもあります。
こういったコーディングスタイルから脱去するために、パターン化された処理の流れと、そこに含まれる定型処理をあらかじめ組み込んだものを用意しておき、それに合う形で独自のコードを記述しはめ込んでいくことで、コーディング効率を上げるツールがフレームワークです(図1)。簡単に言うと、差分コーディングです。
フレームワークは、独自に作ることもできます(独自に作ったフレームワークを通称「オレオレフレームワーク」と言います)。会社によっては社内独自のものを作っておき、それを実開発に使っている場合もあります。
ただ通常は、そういったフレームワークの作成を専門に行っている企業や有志チームのものを使います。有志チームのものはオープンソースであることが多く、原則無償です。一方、企業のものは有償のものもあります。
いずれの場合も、オレオレフレームワークにはない利点が多々あります。というのは、オレオレフレームワークの場合は、定型処理をまとめるだけにとどまることが多い一方、オープンソースや有償のフレームワークは、フレームワーク作成に長けた技術者が作っているので、通常のコーディングでは難しい内容のものを簡単に利用できるように工夫していたり、セキュリティにも配慮した構造になっていたりします。
なので、全ての処理を独自にコーディングするよりは、フレームワークを利用した方が効率的で安全なシステム開発が行えることの方が多いです。
フレームワークはライブラリとは違う
フレームワークと似て非なるものとしてライブラリがあります。ライブラリもさまざまな機能をまとめて利用できるようになっていますが、これらは差分コーディングとして利用できる形態にはなっていません。あくまで一連の処理の流れはプログラマ側で制御し、その途中途中でライブラリに含まれる便利な関数やクラスを利用します(図2)。
一方、フレームワークは、この処理の流れはプログラマ側では制御しません。フレームワーク側で流れが決まっており、フレームワークが制御します。プログラマはフレームワークの制御に合う形でコーディングを行います。自由度は低くなりますが、コーディングそのものは差分で済むように作られています。
フルスタックフレームワークと軽量フレームワーク
本連載で扱っていくSlimは、PHP用オープンソースのフレームワークの1つです。PHP用のフレームワークとしては、老舗であるSymfonyやCakePHP、最近人気のLaravelなどがあります。これらのフレームワークは、先述のパターン化された処理を差分開発するためのツールだけではなく、データベースからデータを取得する処理を自動化できたり、ログインなどの認証を自動化したりといった、PHPのWebシステムを作成するために必要なほぼ全ての機能が含まれています。このようなフレームワークのことを、「フルスタックフレームワーク」と呼びます。
これらのフルスタックフレームワークは、確かに機能が豊富であり、作成するシステムによっては大幅な時間短縮になります。その一方で、ほぼ全てのコーディングがフレームワークの約束ごとに従ったものとなるので、その約束ごとをあらかじめ学習しておく必要があります。また、その約束ごとから外れたコーディングが必要になった途端、コーディングの難易度が極端に上がることも多々あります。これは、フレームワークそのものがブラックボックス化して、内部で何が行われているかわからない状態で差分コーディングを行っているのが原因です。
[Note]Laravelの連載開始
少し宣伝になりますが、Laravelについては、このCodeZineで来月より連載を行います。そちらも合わせて読んでいただければ幸いです。
このフルスタックフレームワークの対極にあるのが、「軽量フレームワーク」と呼ばれるもので、Slimはその1つです。フレームワークが活躍する部分を限定し、最も面倒くさいところだけを担うようにしています。そのため、フルスタックフレームワークを使う場合に比べてコーディングする量は増えます。一方で、フレームワークがブラックボックス化する部分が少なく、フレームワークに縛られることも少ないため、自由度の高いシステム作成が可能となります。
Slimとは
では、軽量フレームワークであるSlimの特徴とは何でしょうか。これは、SlimのサイトのドキュメントのTOPページに以下のように記述されています。
At its core, Slim is a dispatcher that receives an HTTP request, invokes an appropriate callback routine, and returns an HTTP response. That’s it.
ここに書かれている通り、Slimは、リクエストが送信されるとそれに応じた関数を実行し、レスポンスを返すことを主な目的としたフレームワークです。こういった、Webシステムの基本原理となる、リクエストとレスポンスの制御処理を「HTTPルーティング」処理と言います。つまりSlimは、「HTTPルーティングに特化したフレームワーク」と言えます。
もちろん、HTTPルーティングだけではなく、他に、実際の処理の前後にフィルタリングの機能を提供する「ミドルウェア」機能や、「エラー処理」機能、処理中に依存するインスタンスを実行時に外部から与えてもらえる「DI(Dependency Injection: 依存性注入)」機能も提供しています。
この連載では
さて、そのSlimを紹介するこの連載ではまず、Slimのコア機能であるHTTPルーティングを扱っていきます。SlimでHTTPルーティングを実装する方法を一通り紹介した後に、ミドルウェア、エラー処理、DIのそれぞれを紹介していきます。