1

Kohana MVC フレームワークを使用して PHP で MVC アプリケーションを構築するのに忙しく、非常にうまく機能します。しかし、対処したいいくつかの小さな煩わしさがあります。

コントローラーとコントローラー自体のアクション間で、多くのロジックが繰り返されます。私はそれについて考えてきましたが、この共有ロジックを含むオブジェクトを定義するのが賢明だと思ったので、繰り返されません。

それから、いくつかのポッドキャストでビューモデルについて聞いたり、ビューでのミッションクリープの防止、または無知は至福です. したがって、ビューモデルは私が探していたものです。

しかし、ここで問題が発生します。ビューモデルに何を入れますか。私の考えは、対応するビューが必要とするすべての情報をビューモデルに収集させるというものでした。これには、すべてのコントローラー/アクションが入力データをビューモデルに渡し、それをビューに渡すだけでよいという利点があります。

これは賢い考えですか?テストに代わって、モデルをビューモデルに渡してモックできるようにするのが賢明です。しかし、私は実際にはモデルを使用していません。代わりに、コントローラーが Doctrine ORM 経由でデータベースにアクセスできるようにしました。すべてのクエリを個別のメソッドに変換するのは少し面倒に思えましたが、何かが足りないのかもしれません。

ビューモデルについて聞いたところによると、それらは単なる DTO です。しかし、動的に弱く型付けされた言語での利点は何でしょうか?

たぶん、私は完全に間違った方向に進んでおり、別の方法で行う必要があります。これについてどう思いますか。

編集:

私が話しているロジックのほとんどは、適切な情報を収集し、それを適切なビューに渡すことです。

例:

私はカスタマーコントローラーを持っています。これらには、追加と編集の 2 つのアクションがあります。これら 2 つのアクションには、同じビューを使用します。どちらのアクションでも、ビューに同じ変数が割り当てられます。add アクションでは、フォームが有効でない場合、入力変数がビューに再度渡されます。編集アクションでは、既存の値が通過します。これは私が対処したい大きな重複です。

4

2 に答える 2

2

繰り返されるロジックは、何らかのリファクタリングが必要であることを示しています。あなたはそのロイックが何であるかを述べていないため、どこにリファクタリングしたかはわかりませんが、Do Not Repeat Yourself は有用な原則です。だから独創的なアイデアがいい。Controller から DB への直接のやり取り (つまり、モデルの欠如) が重複の理由の一部なのだろうか?

ビュー モデルは単なる DTO ではありません。これらはビジネス データを含み (または指し示し)、関連する解釈ロジックも備えています。あなたが参照している「ミッション クリープ」の記事で、そのアイデアがわかります。ビュー自体は、リンクを表示するかどうかを知りたがっています。その決定は、さまざまなビジネス データに基づいています。そのロジックを単純なshowLink()メソッドにまとめます。その後、ビューはプレゼンテーションに集中でき、viewModel は解釈に集中できます。そして、これも重要なことですが、実際のビジネス データ自体はプレゼンテーションについて何も知りません。

于 2009-12-23T09:28:13.203 に答える
0

前の段落での、コントローラーでのコードの繰り返しに関する懸念への対処... Kohana では、通常、共通のコントローラー コードをベース コントローラーに配置し、そこからすべてのコントローラーを継承します。

たとえば、あるプロジェクトでは、修正されたバージョンの Template_Controller を使用して、すべてのページで $this->auth として使用できる Auth モジュールへの参照を作成しています。

abstract class Template_Controller extends Controller {

    /* @var Auth_Core reference to authorization class */
    protected $auth;

    public function __construct()
    {
        parent::__construct();
        [snip]
        $this->auth = new Auth();
    }
[...]
}

これで、すべてのコントローラーが次のように始まります。

class Help_Controller extends Template_Controller {

したがって、すべてのコントローラーは、任意の関数内で $this->auth にアクセスできます。ビジネスロジックをビューから除外することに同意します。それが全体のアイデアです。

于 2009-12-23T09:37:55.817 に答える