3

私が見たすべての例では、MVCがモデルとしてクラスを使用し、コントローラーとしてクラスを使用し、ビューとしてHTMLテンプレートを使用する必要があります。そして、それらはすべて、1つのindex.phpスクリプトと、サイト全体を実行するためのURL内のさまざまなリクエストで構成されていました。

だから、それらはすべて次のようなものでした...

MODEL
class User{
    function getUser($userID){
      $sql = mysql_query('SELECT name......');
      // more code.....
      return $array
    }
}

VIEW
<h2><?php echo $user['name']; ?></h2>

CONTROLLER
class Controller{
    $userModel = new User;
    $userInfo = $userModel->getUser($id);

    $template = new Template('usertemplate.tpl');
    $template->setVariables($userInfo);
    $template->display();
}

モデルが単にデータを取得して保存するクラスで構成されている理由を理解しています(クラスは常に必要であり、関数を使用できると思いますが)。テンプレートが主にHTMLで構成されている理由を理解しています。しかし、なぜコントローラーがクラスなのかわかりません。コントローラーは手続き型スクリプト(モデルからユーザーデータを取得して表示用のテンプレートに送信するuserprofile.phpなど)であると想定します。

また、私が読んだすべてのチュートリアルでmodの書き換えが扱われ、「index.php?user = 1」やindex.php?news=3などのURLにリクエストがある単一のページを使用して全体を実行するのはなぜだろうと思っていました。サイト。user_profile.php?id = 1やnews.php?id =3..のような別々のページがあるのはどうしたのですか。

誰かが途中で簡単な「チュートリアル」と説明を手伝ってくれませんか。たとえば、MVCを使用して登録フォームをどのように実装するのでしょうか。ありがとうございました

PS。他にどのようなデザインパターンがありますか

4

4 に答える 4

1

PHPバージョンのMVCでのコントローラーの大きな「利点」は、アプリケーションが応答するURLごとに個別のPHPページを用意する必要がないことです。

URLごとに新しい単一ページを作成する場合、開発者(または自分自身)が必要なライブラリを取得し、同じ方法でテンプレート/レイアウトエンジンを初期化することを期待しています。あなたが単一の開発者である場合でも、物事を行う「標準的な」方法から脱却する誘惑は通常、強すぎることになります。つまり、各URL / PHPページは、各URL/ではなく独自のミニアプリケーションになります。 PHPページは同じアプリケーションの一部です。複数の開発者がいる場合、これが発生することが保証されます。

最終的には、ページとコンポーネントが互いにうまく機能せず、デバッグが難しく(すべてがグローバル名前空間にぶら下がっている)、プロジェクトで作業する必要のあるユーザーと開発者の両方に一貫性のないエクスペリエンスを提供します。 。

MVCフレームワークを使用すると、サイトにわかりやすいURLを簡単に提供することもできます。通常、ルーティングシステムでは十分な処理が行われているため、膨大な数のクエリ文字列変数に頼る必要はありません。読み取り可能なURLは、SEOや知識のあるユーザーにとってプラスです。

最後に、これはほとんどの店で空のパイですが、コントローラーがある場合、コントローラーのメソッドは簡単にユニットテスト可能になります。テストハーネスをMVC以外のサイトに技術的にラップすることはできますが、それは常にお尻の痛みであり、思いどおりに機能することはありません。

于 2009-10-12T04:31:02.530 に答える
1

「index.php?user = 1」やindex.php?news = 3などのURLにリクエストがある単一のページを使用して、サイト全体を実行します。user_profile.php?id = 1やnews.php?id =3..のような別々のページがあるのはどうしたのですか。

単一のエントリポイントを使用すると、いくつかのことが簡単になると思います。

  • user_profile.phpとnews.phpのコードの一部を複製する必要はありません
  • あらゆる種類のフィルター(セキュリティ用のPHPIDSやACLなど)を設定する場合、変更するファイルは1つだけで、アプリケーション全体に対して実行されます。

PS。他にどのようなデザインパターンがありますか

デザインパターンはたくさんあります; たとえば、ウィキペディアのデザインパターン(コンピューターサイエンス)の記事にリストがあります。詳細については、それぞれのページへのリンクがあります。

于 2009-10-12T04:23:39.313 に答える
0

アクションごとに個別のスクリプトを使用しても問題はありません。実際、コントローラーのクラスを使用せずに、この方法でMVCアーキテクチャーを作成できます。私は現在、両方のスタイルをサポートするMVCフレームワークに取り組んでいます。

重要なことは、実際にはさまざまな懸念事項を分離し続けることです。データベースロジックはモデルに、レイアウトロジックはテンプレートに、その他すべてはコントローラーに組み込まれます。

したがって、非常に単純な例として、次のコードを含むスクリプト「register.php」を作成できます。

$signup_options = SignupOptions::getSignupOptions(); // Load some data      
require("register_form.php");  // Pass it to the view

そして、これはregister_process.phpに投稿します

$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$email    = $_REQUEST['email'];
Users::Register( $username, $password, $email );
header( 'location: register_success.php' );

MVCはすべてのアプリケーションに適しているわけではないため、プロジェクトごとにアーキテクチャを検討する必要があります。多くのサイトでは、独立したスクリプトをたくさん持っているだけで問題ありません。ただし、より大規模で複雑なアプリケーションの場合、MVCはWebアプリケーションを開発するための信頼性が高くスケーラブルな方法であることが証明されています。

もう1つの一般的なデザインパターンは「View-Helper」です。これは、テンプレートを直接呼び出す場所であり、テンプレートは、テンプレートとモデルの間でビジネスロジックを実行する「Helper」オブジェクトを呼び出します。概念は似ていますが、MVCのような関心の分離を維持しながら、それを必要としないテンプレート用の余分なコードをスキップできます。(違いは、基本的に、コントローラーを呼び出すのではなく、テンプレートを直接呼び出すことです)。

于 2009-10-12T04:22:10.333 に答える
0

優れたアプリケーションを実装する方法はいくつかありますが、ここではいくつかの概念について説明します。これらの概念は、SamstylePHPFrameworkから採用されています。

まず、次のコンポーネントがあります:モデル(テーブルデータゲートウェイ)、ビュー、ビューコントローラ、およびバックエンドコントローラ。

このViewControllerは、実際にビューがどのようになるかを制御します(たとえば、登録フォームを表示します)。バックエンドコントローラーは、バックエンドでユーザーデータを処理し、モデル(データベース)と対話します。

したがって、ここでは、 Post-Redirect-Getを簡単に統合できます。

フォームを表示し、コンテンツをテンプレートHTMLファイルに解析するViewControllerのregister.phpがあるとします

ユーザーはフォームを使用して送信すると、バックエンドコントローラーdeck.phpに投稿されます。バックエンドコントローラーは、データを検証し、チェックしてから、データベースとの対話に役立つ関数(Table Data Gateway)にデータを渡します。インタラクションが完了すると、ユーザーは成功ページまたはエラーのある登録ページにリダイレクトされます。

モデル(テーブルデータゲートウェイ)には、実際には配列を取り込んでからデータベースでCRUDを実行する関数があります。

于 2009-10-12T04:22:34.963 に答える