2010-11-22 8 views
0

これは、背後にある本当の問題との質問、ちょうど私の病気の心の製品やだから、私はこのPHPアプリケーションが上に構築してい:)PHP:コード設計のジレンマ

少し奇妙なものを作るために車で私の独自のMVC指向のフレームワーク(はい、私は自分の代わりに既存のフレームワークを使用しました)。そして、モデル(データとデータベースの操作)、ビュー(データとレンダリングの出力で満たされたテンプレート)、コントローラ(要求の処理、モデルからの適切なデータの取得、データの表示) .htaccessルールで要求ルーティングが行われる、古典的で退屈なシナリオ。

昨日、コード、バグ修正、カップルの改良などでいくつかの変更を加えました。そして、私はコントローラのコードを並べ替えるよう強く感じました。彼らは幾分重くて肥大しており、メソッドの数はファイルやそのようなものをナビゲートするのが難しくなります。みんなが私のことを知っていると確信しています。

私は、コントローラクラスを多くのクラスに分割することを考えています。それぞれのクラスは、loginやregister、showProfile、killMeといった1つのタイプのリクエストしか処理しません。

コントローラクラスには、ユーザーフレンドリーな(または多分SEOフレンドリーな)URLの部分に対応するパブリックメソッドがあり、ルーティングクラスは適切なコントローラを呼び出し、URLコンテンツに従ってメソッドを呼び出します。

変更私は、特定のコントローラを呼び出すために少しのルーティングメカニズムをシフトすると考えています。それはExecute()メソッドです。例えば

は、URLの= "www.example.com/users/login" 、今ではそのようになっています

$controller = new url[0](); 
$method = url[1]; 
echo $controller->$method(); 

、今URLが "www.example.com/login" に変更しますおよびルーティングコードは、次のようになります。

$controller = new url[0](); 
controller->Execute(); 

は私がURLを解析し、それは私の質問には無関係であるとして、そこから情報をルーティング抽出部品を省略しました。

私はその変更にどのようなメリットがありますか? 1つの要求

  • 小さなファイル
  • 小さいコード
  • 簡単にメンテナンス
  • 新機能(要求の新しいタイプ)を追加したり、バグを修正する際の作業コントローラーを壊すの限られた危険あたり

    • つの専用クラス

    短所?

    • おそらくクラス
    • のパフォーマンスの多くは
    • を打ちます?

    私の質問は、そのアイデアについてどう思いますか、それはまったく意味がありますか?そして、もちろん私はなぜ私がそれをしなければならない理由にもっと興味があるのですか?あなたはそれはひどいアイデアや醜態だろう、なぜ任意の理由を考えることができるならば、それは:)手遅れ

    になります前に、ここで話してくださいEDITED 質問の明確化:

    私は私かどうかを聞いていますのよ私の単一の大きなコントローラを破壊する必要があります。このコントローラは、多くの種類の要求を単一のタイプの要求のみを処理する多数の小さなコントローラに分割して処理します。

    "login"、 "showLoginForm"、 "register"、 "activate"などのリクエストを処理するコントローラユーザがいます。リファクタリングされたコードは、これらのリクエストごとに別々のコントローラで構成されます。

  • +0

    [FrontController](http://martinfowler.com/eaaCatalog/frontController.html)が[トランザクションスクリプト](http://martinfowler.com/eaaCatalog/transactionScript.html)を呼び出すべきかどうか、または[PageController](http://martinfowler.com/eaaCatalog/pageController.html)または別のもの?私はあなたが探しているものをまったく入手しません。 – Gordon

    +0

    私は何についておっしゃっているいくつかの説明を追加しました:) – grapkulec

    答えて

    0

    私が考えている欠点は、古いメソッドと新しいメソッドの両方で、クラス名に直接URLをマッピングしていることです。 URLを変更したい場合は、クラス名を変更する必要があります。言語ごとに異なるURLを使用する場合は、URLをクラス名にマップするレイヤーを追加する必要があります。 これは、私がむしろ、継ぎ目を変更するクラス名にURLをマップするルーティングクラスを持つことになります。

    +0

    良い点。私はおそらくそれらを処理する実際のコードからURLを分離することを考えるべきです、現在のマッピングは非常に柔軟ではありません – grapkulec

    +0

    これは私のコードで行ったこととまったく同じですので私はこの答えを受け入れています。この質問を書く:) – grapkulec