1

最近、アプリケーションに MVC 構造を実装する方法を学んでいます。近い将来、PHP フレームワークを使用する予定ですが、今のところ純粋な PHP です。コントローラーは「スキニー」で、モデルは「ファット」であるべきだと学びましたが、これがきれいな URL とどのように連携するのか理解できないようです。

インターンシップを行っている会社で、データベース内の 3 つの異なるテーブルに対して CRUD アクションを実行する Web ベースのアプリケーションを開発しています。各テーブルには固有のフィールドがあります。つまり、これらのテーブルごとに 4 つのビューが必要です (CRUD アクションごとに 1 つ)。

私はクリーンな URL を利用したいので、現在、URL をセグメントに分割して分析し、各セグメントの特定のメソッドとビューを呼び出す 1 つ (1 つだけ) のコントローラー (index.php) を持っています。 ) ユーザーを正しい URL にリダイレクトします。

現在、コントローラーには 1000 行近くのコードが含まれています。私はいつも、コントローラーは「スキニー」であるべきだと読んでいて、1 つのアプリケーションで複数のコントローラーについて話している人を見てきました。これをきれいな URL と組み合わせて実装する方法を理解できないようです...

どんな助けでも大歓迎です。私がインターンシップをしている会社では、Webデザイナーしかいないので、彼にプログラミングに関する質問をすることはできません...

以下は、私のコントローラー (index.php) の基本的な表現です。

// Check if user is logged in
if (isset($_SESSION['username']) AND isset($_SESSION['loggedIn'])) {

    // Get URL from $_SERVER
    $url = $_SERVER['REQUEST_URI'];

    // Split URL and assign values to $url
    $url = trim($url, "/");
    $url = explode('/', $url);

    // Remove first url segment (index.php) for convenience
    array_shift($url);

    // Check if 1st URL segment (category) is set
    if (isset($url[1])) {
        $category = $url[1];

        // Check if category is 'apples'
        if ($category == 'apples') {

            // Check if 2nd URL segment (action) is set
            if (isset($url[2])) {
                $action = $url[2];

                // Check if action is 'add'
                if ($action == 'add') {
                    // Calls to Model
                    // Include Presentation (form to add new record to 'apples' category)
                }

                // Check if action is 'view'
                elseif ($action == 'view') {
                    // Calls to Model
                    // Include Presentation (list of all records in the 'apples' table)
                }

                // Check if action is 'edit'
                elseif ($action == 'edit') {

                    // Check if 3d URL segment (id) is set
                    if (isset($url[3])) {
                        $id = $url[3];

                        // Calls to Model
                        // Include Presentation (form to edit record of the 'apples' category);
                    }

                    // If 3d URL segment (id) is not set then redirect
                    else {
                        header('Location: index.php/$category/view');
                    }
                }

                // Check if action is 'delete'
                elseif ($action == 'delete') {

                    // Check if 3d URL segment (id) is set
                    if (isset($url[3])) {
                        $id = $url[3];

                        // Calls to Model
                        // Include Presentation (form to edit record of the 'apples' category);
                    }

                    // If 3d URL segment (id) is not set then redirect
                    else {
                        header('Location: index.php/$category/view');
                    }
                }

                // If 2nd URL segment (action) is invalid then assume user wants to view and redirect
                else {
                    header("Location: index.php/$category/view");   
                }
            } 

            // If 2nd URL segment (category) is not set then assume user wants to view and redirect
            else {
                header("Location: index.php/$category/view");
            }

        }

        // Check if category is 'pineapples'
        elseif ($category == 'pineapples') {
            // same here as in 'apples' code block
        }

        // Check if category is 'pears'
        elseif ($category == 'pears') {
            // same here as in 'apples' code block
        }

        // If 1st URL segment (category) is invalid then redirect to index.php
        else {
            header('Location: index.php')
        }
    }

    // If 1st URL segment (category) is not set then show category overview
    else {
        include 'presentation/category_overview.php';
    }
}

// If user is not logged in then check if login form got submitted
elseif($_POST['formSubmit'] == 'submit') {
    // Calls to Model (form and user credentials validation)
    // Include Presentation (category overview)
}

// If user is not logged in and did not submit login form then include view (login form)
else {
    include 'presentation/login.php';
}
4

3 に答える 3

1

コントローラーが実際に何をするかについて、誤解が生じていると思います。

URL の分割はコントローラーの責任ではありません。これは通常、別のルーティング メカニズムで行われます。フロント コントローラと呼ばれることもあります。は通常、正規表現を使用して実装されます (APC の支援を受ける場合もあります)。

Web MVC にインスパイアされたパターンでは、基本的に次の 2 つのオプションがあります。

  1. モデルレイヤーとビューの状態の変更を担当する古典的なコントローラー。
  2. モデルレイヤー構造を初期化し、ビューを作成し、モデルレイヤー要素をそのビューにバインドしてからレンダリングするページコントローラー

PS MVC の残りの部分については、 thisthisのコメントが役に立つかもしれません。

于 2012-07-18T00:36:03.930 に答える
0

それはMVCの実装方法ではありません!

  • まず、コントローラ、モデル、またはビューごとにクラスが必要です。
  • 各クラスは個別のファイルにある必要があります。
  • ファイルは、クラス タイプに従って個別のディレクトリにグループ化する必要があります。

注文テーブルがあると考えてください。

/index.php
/controller/order.php
/model/order.php
/view/order/grid.php
/view/order/form.php

index では、プログラムをルーティングするだけです。コントローラーをインスタンス化し、要求された関数を呼び出す必要があります。コントローラーはモデルから必要なオブジェクトを取得し、それらをビューに入れ、ビューをインデックスに返す必要があります。index はビューで render を呼び出し、結果を出力します。

于 2012-07-18T00:35:29.420 に答える
0

フロント コントローラー パターンの実装に加えて、真の MVC アプリケーションは、優れたオブジェクト指向設計のすべての品質 (モジュール性、疎結合、結束、関心の分離、DRY など) を示す必要があります。

したがって、明らかに、すべてのモデル、ビュー、およびコントローラーには、基本モデル/ビュー/コントローラー クラスにカプセル化する必要がある多くの共有機能があります。そして、これらの基本クラス (および動作、ヘルパー、コンポーネントなどのクラス) と必要なユーティリティ ライブラリ (ルーティング エンジン、DAL など) が MVC フレームワークの基礎を形成します。

すべてのアプリケーションで再利用されるフレームワーク ライブラリは、個々のアプリケーションのフレームワーク上に構築されたアプリケーション固有のコードと区別する必要があります。そして、 「スキニー コントローラー、ファット モデル」で参照されているのは、アプリケーション固有のモデルとコントローラーです。

ベース コントローラーには、アプリケーション フローの調整、モデルのインスタンス化、モデルの検証のトリガー、ビューのインスタンス化、コールバックのトリガー、モデルとビュー間のデータの受け渡し、セッション処理の実行、スキャフォールディングの実装などを行うコードが含まれている必要があります。

ただし、アプリケーション コントローラーは、基本コントローラー クラスから継承するだけでこれらすべての機能を取得し、コントローラーの設定とアクションを定義するために必要な最小限のコードのみを含めることができます。

于 2012-07-18T01:49:25.990 に答える