1.3. PHP フレームワークを組み立てる
フレームワークを構築する方法はさまざまあります。とても複雑なフレームワークを好む人もいれば、とてもシンプルなものを好む人もいます。私たちの記事では、使いやすく理解しやすいフレームワークを手早く組み立てていきます。
私たちの記事は、オンラインストアの作成に必要なものとは異なる、あなた自身のフレームワークの開発を助けます。より大きなものを作るために、フレームワークに他の部分を簡単に追加できるようになります。この連載記事の主な目的は、あらゆる CMS 向けに自分自身のフレームワークを作れるようになることです。
パターン(Patterns)
フレームワークの開発には、さまざまなアプリケーション設計のテンプレート、すなわちパターンが用いられます。パターンとは、プログラム開発に関わる共通の課題を解決する、最も優れた解決策と実践のことです。パターンのうち、私たちは次のものを使います:
- モデル・ビュー・コントローラー(MVC, Model-View-Controller)
- レジストリ(Registry)
- シングルトン(Singleton)
モデル・ビュー・コントローラー(MVC)
MVC は私たちのフレームワークの基礎で、ユーザーインターフェースとアプリケーションのロジックを分離する解決策を提供します。ユーザーインターフェース(View)は、コントローラー(Controller)を使ってデータモデル(Model)とやり取りします。コントローラーは今度は、モデル内のデータを管理するのに必要なビジネスロジックを含みます。
例えば、ユーザーがビュー(view)で「カートに追加」をクリックすると、コントローラーがこのリクエストを処理し、カートのモデルとやり取りして商品をカートに追加します。通常、カートのモデルからのデータは、現在カートに何点の商品があるかをコントローラーに返し、新しい商品数の新しいカートを表示します。

私たちは自分のフレームワークを使い、MVC を基に機能を拡張できます。先に述べたように、データはモデルで表され、データ自体はデータベースに置かれます。ただし、モデルとデータベースのテーブルは同じ形式です(モデルのフィールドはテーブルのフィールドと一致します)。ですから、私たちの MVC の図を拡張できます。また、View で処理されてブラウザに表示される最終結果も見えるので、それも図に加えます。

レジストリ(Registry)
レジストリは、私たちのフレームワークのオブジェクトのコレクションを保存する機能を提供します。レジストリの必要性は、MVC パターンに関わる抽象化から生じます。各コントローラーとモデル(例:商品、カート、ページ)は、次のような共通の課題を実行するために必要です:
- DB へのクエリ
- 必要な情報を得るためにユーザーが認証済みかの確認
- View へのデータの送信(テンプレートの管理)
- メールの送信、例えばサイトで商品を購入したとき
- ファイルシステムとのやり取り、例えば商品の写真のアップロード。
ほとんどのシステムやフレームワークは、これらの機能をオブジェクトで実行します。私たちもそうしたオブジェクトを作ります。レジストリは、これらのオブジェクトをまとめて保存できるようにします。レジストリはフレームワーク内のどこからでも呼び出せ、そのために自身の機能へのアクセスを提供します。これが私たちのレジストリのおおよその図です。

フレームワークはレジストリと直接やり取りし、必要なときに他のオブジェクトへのアクセスを提供します。レジストリ内部では、オブジェクト同士もやり取りできます。例えば、テンプレートマネージャはファイルマネージャと連携でき、メール送信者はメールテンプレートと連携できます。
シングルトン(Singleton)
singleton は、日本語では「シングルトン」と呼ばれ、ドキュメントでもシングルトン、あるいは単に英語で singleton と書かれるのが一般的です。
シングルトンは、理解するのが最も簡単なパターンの 1 つです。主な目的は、クラスのインスタンスがただ 1 つだけ存在することを保証することです。その理由は通常、次のようなものです。元のクラスのオブジェクトが 1 つだけ必要で、そのオブジェクトがアプリケーションのどこからでも利用できる、すなわちグローバルアクセスが必要な場合です。
シングルトンは、クラスに目的が 1 つしかないときに使われます。例えば、他のオブジェクトが DB とやり取りできるよう、データベースとの接続を構成する場合です。
全体の構造
私たちのフレームワークの開発に向けた次のステップは、構造の計画です。次のための構造を作る必要があります:
- モデル
- ビュー(私たちのフレームワークでサイトのスタイルを切り替える機能を統合できるよう、1 つのスタイルごとに別のフォルダを用意する)
- コントローラー(コントローラーを別のフォルダに保存できるよう。機能を追加したい場合は、コントローラー入りの新しいフォルダを追加するだけでよい)
- 管理者のコントローラー(私たちはフレームワークだけでなく CMS も作るので、モデレーターや管理者がサイトに情報を入力できるようにする必要がある)
- レジストリ
- レジストリのオブジェクト
- アップロードされるファイル
- サードパーティのライブラリ
- その他のコード
フレームワークの構造を考慮すると、私たちのフレームワークのフォルダは次のようになるべきです(PHP ではそれが慣例なので、フォルダ名は英語を使います):
- Models
- Views
- View A
- Templates
- Images
- JavaScript
- Controllers
- Controller A
- ControllerA
- ControllerAAdmin
- Controller A
- Registry
- Objects
- Database objects
- Assets
- Uploads
- フレームワークに商品と画像を追加するときに拡張します!
- Libraries
- Miscellaneous