2009-07-13 10 views
0

ここ数週間、私はPHPを使ってWebアプリケーションのMVCデザインパターンを研究してきました。幅広い視点から、私はパターンがどのように動作するのか、それが小規模から大規模のあらゆる種類のWebアプリケーションを実装する非常に良い方法であることを理解しています。MVC PHP Webアプリケーションでのコントローラの作成と結合

私はそれを理解として、私たちはそうのようなコントローラを介してお互いに話3の別個の層があります。

ユーザー入力--->表示--->コントローラ--->モデル

サイト出力< ---表示< ---コントローラ< ---モデル

私の計画した実装では、私のデータベース内の各テーブルのモデルを持っていて、それぞれのモデルは管理に必要なすべての機能/ロジックこの表これらのモデルにはそれぞれ関連するビューがあります。モデルとビューにはもちろん、それらを使用できるようにするコントローラがあります。

これで、データベースを必要とする単一の論理的なアクションがカバーされているので、頭を悩むことは簡単です。しかし、特定のアクションで複数のテーブル/モデルを使用する必要がある場合はどうなりますか?

アプリケーションの管理側は、データベースを維持するために一度に複数のモデルを必要としない可能性があります。アプリケーションのフロントエンドまたはユーザー側は別の問題です!特定のセクションの記事リスト、現在ログインしているユーザーのリスト、タグクラウドなどのSOサイト統計からの例を借用したWebページがあるとします。

この1ページには、私の予定されているデザイン(記事、ユーザー、タグ)に少なくとも3つのモデルが必要です。

明らかに私の単一のコントローラはそれをカットしません。では私は何をしますか?

  1. ウェブページ用の新しいモノリシックコントローラを作成しますか?

    • ことは私は私が望む結果を取得できるよう
    • コーディング重複の多くを必要とする変更が
  2. が小さく操作する「スーパー」のコントローラを作成し、必要に応じて維持するために本当にハード

  3. 特定のコントローラ

    • 私が望む結果を得ることができます
    • 私は現在の方に誤るい
    • は、モジュール式になりますので、ひとつのスクリプトへの変更はは、最小限のコードの重複

を作成し、[ここで華麗なソリューションを挿入]他人

  • に影響を与えるべきではありませんオプション2。理論的には、必要なすべての動作がより小さいコントローラに存在するため、すべてのメンテナンスが容易になるため、コーディングを減らす必要があるからです。

    多分それは次のようになります。

    articlecontroller.php

    <?php 
        //Article Controller Script 
    
        if($_GET['article'] = 'foo') 
        { 
         //magic necessary for displaying article "foo". 
        } 
    ?> 
    

    usercontroller.php

    <?php 
        //User Controller Script 
    
        if($_GET['user'] = 'display') 
        { 
         //magic necessary for displaying users 
        } 
    ?> 
    

    supercontroller.php

    ご覧のとおり、私のスーパーコントローラは、その特定のページが必要としているものを見て、必要なコントローラを備えています。 NB:コードはちょうど迅速かつ汚れた例です:)

    しかし、私はプロではないので、私はあなたに尋ねています。どのオプションが優先されますか?オプション3のどちらもお勧めしませんか?どんなコードスニペット/例も可愛く、必須ではありません。

    これまでに作成した場合は、お時間をいただきありがとうございます。


    私はこの質問を更新すると思っていました[それを忘れてしまった - P]。私はFat Models/Skinny Controllersのコンセプトを見て、どのようにしたらいいか分かりましたので、私は確実にその方向性を取っていきます。

    私は他のフレームワークのいくつかとMVCパターンをどのように達成するのかについてアドバイスを受けました。取り込むことはかなり多いです!それでも、私は道に沿ってかなり新しいことを学んだので、それは大きな利点でした。私は将来もっと多くの質問をするかもしれませんが、今は十分なスタートを切っています。

    ありがとうございます。

  • 答えて

    6

    私はあなたのモデルで取りたい方向に同意しません。 1モデル= 1のテーブルデザインは長期的にあなたを傷つけるでしょう。

    まず、model == databaseという厳密な概念を削除する必要があると思います。これは非常に頻繁に当てはまりますが、モデルは単なるデータであり、XMLファイル、キャッシュ、またはWebサービスから来る可能性があります。

    this excellent answerBill Karwinで調べてください。これは、これらの懸案事項を非常にうまく解決しています。第二に

    、一部はfat models, skinny controllers(またはthin controllers)のトピックを読んでください

    最後に、ちょうどFYIの多いものとして、「supercontroller」のアイデアは、より一般的に「フロントコントローラ」として知られているものである

    +0

    それは非常に小さなフレームワークで、1モデル= 1テーブルは、ほとんどの部分でかなりうまく動作します。しかし、私はいくつかのモデルが複数のテーブルを必要とすることを知っているので、私はそれを完全に制限するつもりはありません。 私は自分のPHPフレームワークwww.radicore.orgを開発したTony Marstonという人物によって記事を読んでいました。彼は1 Model = 1 Tableを使用することを提唱しています。それは自分のデザインに影響を与えた彼のアイデアです。それは彼が唯一の方法だと言っているわけではありませんが、彼は非常に堅牢な枠組みを持ち、彼のものを知っている人です。 – Etzeitet

    +0

    私は彼のページのいくつかの情報を読んでいます。私はあなたがモデルで彼の意図を誤解していると思います。 MVCの彼のページからの引用があります。「モデルとは、データやアクティビティを表すオブジェクトです。たとえば、データベーステーブルや工場の生産現場のプロセスなどです。 –

    +0

    ああ、間違ってはいけない。私は彼が "テーブルごとに1つのモデル"に専念するのではないことを知っていますが、あなたが探検し続けるならそれは顕著に特徴的です。 いずれにせよ、私はすでに1モデル/ 1テーブルに固執するつもりはないと言いましたが、それが意味をなさないところでは私はそれを行うことに何の問題も見ません。 – Etzeitet

    2

    PHP MVCのフレームワークを見てください。彼らはすでにこのすべてのものを考え出しています。彼らはURLルーティング(/記事/編集/ 1)、良いMVC分離、それを助ける素晴らしいドキュメントを持っています。そのため、コントローラからビューを呼び出す方法を気にする代わりに、アプリケーションについて考えることができます。私は最終的にダイビングを取ったときに個人的にトンのを救った。

    他にもたくさんあります。

    PHP MVCフレームワークを最初から作成することは、おそらくそれほど効果的ではありません。車輪を再設計するのに死んだ場合、インスピレーションのためにこれらのフレームワークに入った設計上の考慮事項を少なくとも見てください。

    +0

    ああこれを達成するために他のフレームワークが何をしているのか見ていないと思います。手を汚して掘り起こす時間! 自分のフレームワークを作成するのは、私がそれをやることができるかどうかを確認するのは個人的なプロジェクトです。たとえそれが崩壊しても、道に沿って多くを学ぶべきです。 :) – Etzeitet

    +0

    http://kohanaphp.com/を忘れないでください! – shadowhand

    1

    独自のフレームワークを作成することは、デザインパターン、oopデザイン、そしてPHPの詳細を学ぶのに最適です。

    しかし、Byronがmvcフレームワークのソースコードを示唆し、どのようにmvcパターンを実装したかを知るためには、mvcフレームワークのソースコードを参照してください。 zendフレームワークから何かを取り出し、cakephpから何かを取ってください。最後に、あなたのために役立つものがあり、何かを学んだことになります(注:コードをコピーしないでください! )

    あなたのスーパーコントローラの考え方は大丈夫ですが、夕食コントローラは、クエリ文字列を引数として読み取る必要があります(Zendの.htaccessやその他の方法を確認してください)ので、最初の引数をコントローラとして扱うことができます。残りはそのコントローラへの引数として渡されます。

    幸運!

    +1

    私は、小さなMVCのようなCodeIgniterとMicroMVCは、大きなフレームワークが追加し始めるすべての余分な迷惑なことなしにMVCがどのように動作すべきかを見るのに役立ちます。それでは、より複雑なフレームワーク実装を開始することができます。 しかし、あなたが言うように、自分で構築しようとする前にいくつかのフレームワークをテストしてください!それはあなたに多くの仕事を保存します! – Xeoncross

    +0

    コントローラーの仕組みを具体的に実装するのには至りませんでしたので、私が与えたサンプルコードは、私が得ていたものの、本当に素早く離れた例でした。それを言って、チップのおかげで言った: – Etzeitet

    関連する問題