web-dev-qa-db-ja.com

PHPのフロントコントローラー

Webアプリケーション開発について読んでいるとき、「フロントコントローラー」と「単一のエントリポイント」はよく直面する言葉です。私の理解では、ポイントは、プログラムで何を行うかを決定する単一の場所を提供することです。理論的にはこれですべてうまくいきますが、これが実際にどのように見えるかについては混乱しています。

OOPでは、「コントローラー」は通常「index.php」、または「エントリポイント」であるファイルにインスタンス化されると思います。しかし、そこからどうやって行くのか、そしてコントローラークラスはどのように見えるのでしょうか?これはこれに沿ったものですか?

//Dummy-code, it's just to make a point
class Controller {

    //first function to be called
    public function main() {
        switch($appAction) {
            case "login": userLogin(); break;
            case "view" : viewArticle(); break;
            //...
        }
    }

    protected function userLogin() {
        //Sanitisation of user input
        //making instances of necessary classes etc.
    }

    //...
}

それともコンセプト全体が完全に間違っているのでしょうか?これは私が想像できる唯一のことですが、この方法でのアプローチに大きな間違いがあるのか​​、フロントコントローラーの目的を誤解しているのかはわかりません。

5
Anpan

PHPをそのまま使用すると、次のように動作します(自明であることは許しますが、理解することは重要な基盤です)。

  1. クライアントの訪問:example.com/about.php
  2. サーバー(通常はApache)がこのリクエストを受信し、example.comドメインファイル構造の下を調べ、メインディレクトリで「about.php」を探します。存在する場合、サーバーはabout = phpをターゲットにしてPHP=を実行します。
  3. PHPはファイルを読み取り、記述どおりにスクリプトを実行します。

さて、これの何が問題になっていますか?まあ、ほとんど何も。しかし、いくつかの苦情が一般的になり始めました。

1つは、URL内のスクリプトに追加の情報をどのように渡すのですか。もちろん、クエリ文字列は...そして一部の人々はそれらを醜く発見しました、そしてワイルドでウールの古代には、クエリ文字列が添付されたURLが検索エンジンによって適切に信用されなかった、またはインデックス付けされなかったという噂がたくさんありました。ギャスプ!

他の人々はクエリ文字列を醜くて理解しづらかっただけです。しかし、インターネットはどうですかamiright

もう1つの問題は、「Webアプリケーション」と、ほとんどまたはすべてのページの上部に同じ基本ロジックがあることです。クエリ文字列の処理やCookieの処理、テンプレートロジックの読み込みなどが必要になる場合があります。また、ファイルをあちこちに配置したり、ファイルサイズを管理しやすい状態に保つための条件付きインクルードなどは、煩雑であると考えられていました。

昔、PHPophileには、この共通のロジックをすべて含む共通のrequire()ファイルがありました。しかし、この手法は何年も後から(おそらく5年後信じられる場合は)()反復的で古臭い(他のものの間で)と見なされ、 )。

次に、Apacheを使用してすべてのリクエストを単一のファイルにルーティングし、ApacheにURLの追加のパス情報を変換させて、パラメーターとして単純なindex.phpファイルに渡すことができるという共通の知識になりました!

すべてのリクエストが個々のPHPファイルに直接ではなく、単一のファイルに送信されるというこの基本的な考え方は、「フロントコントローラー」として知られるようになりました。

これらの処理方法のデモンストレーション目的で私のお気に入りのフレームワークは CodeIgniter です。これは、それが超魔法や複雑なものではないためです。 their index.php file を見て、どのように機能するかを確認してください。

基本的にそれは単なる通常のPHPファイルであり、それ自体が他の場所で役立つ可能性がある定数を定義します(BASEPATHなど))、いくつかの重大な回復不能なシステムエラー(アプリケーションフォルダー全体が不明な場所!)など。その後、すべての処理が完了すると、アプリケーションの次のファイルが読み込まれ、次の行に進みます。

フロントコントローラーの重要な機能は、サーバー上の実際のシステムディレクトリファイル構造をURLパスから切断することです。メインディレクトリに「errata」という名前のフォルダーがあり、その中に「misc-gumballs.php」という名前のファイルがあった場合、そのファイルにアクセスするためのURLは単に「example.com/errata/」でした。 misc-gumballs.php」。

フロントコントローラーを使用すると、代わりに「example.com/super-delicious-free-samples/gumballs」を選択し、ApacheとPHPを使用して、次のようなindex.phpファイルを実行します。 「デフォルト」フォルダーで、「classes.php」ファイルをその中にロードし、そのファイルで定義されたPageクラス内で関数を実行し、gumballs($param = null)として、「super-delicious-free-samples」を次のように渡します。パラメータの値。

ああ、歴史! TLDR;

フロントコントローラーは単純なPHPファイルであり、サーバー側のApacheルーティングルールのようなものを使用して、個別のPHPファイルではなく、これにより、すべての一般的なロジックをそのファイルに入れることができ、リクエストパスからのパラメーター化されたデータに基づいて、リクエストの処理方法を条件付きで選択できます。

条件付きのinclude()またはrequire()のように単純にすることも、複雑なオブジェクト指向設計をインスタンス化することもできます。魔法や特に複雑なものは何もありません。

サンプルコードは、通常のPHPスタイルのコーディングでは少し「public void main」ですが、完全に適切なものではありません。私が見たほとんどのシステムは、関数自体をページ名として実装していますが、これは厳密な要件ではないため、概念的には問題ありません。

わかったと思います。

8
BrianH

フロントコントローラーは単なるPHPファイルで、リクエストのディスパス、構成のロード、オートローディングメカニズムの初期化などです。

フレームワークはフロントコントローラーに入る内容によって異なりますが、通常はRoutesのセットがあり、リクエストURLを(ControllerAction)ペアにマップします。たとえば、URLが_user/login_の場合、UserController->loginAction()を呼び出す必要があります。

そのようなアーキテクチャの例として、 Symfony docs を読むことができます。

1
scriptin