0

私は「部分的」という用語を使用して、多くのビューで繰り返されるプレゼンテーションコードの小さなセクションを指します。たとえば、サイドバー。ビジネスロジックとプレゼンテーションロジックが混在しているバニラPHPでは、サイドバーを含めても問題ありません。

if($someCondition) {
    include('sidebar.php');
}

ただし、MVCデザインパターンでは、プレゼンテーションロジックをビューに保持し、ビジネスロジックをコントローラーに保持する必要があります。パーシャルを無条件に含めたい場合はinclude('sidebar.php')、自分の見解に含めることができるので、これは問題ありません。しかし、論理が私の見解から禁止されている場合、私はもはや条件付きでそうすることができません。

私はいくつかの解決策を試みましたが、それらはすべて問題があります。現在、ソリューション2を使用しています。

解決策1

コントローラーからのコンテンツを条件付きで含めることができるinclude関数をビュークラスに作成します。したがって、私のコントローラーでは、次のロジックを使用できます。

if($someCondition) {
    $this->view->include('sidebar.php');
}   
$this->view->show('index.php');

問題: sidebar.phpは、特定の時点でindex.phpにインクルードする必要があり、ビューオブジェクトのincludeメソッドで何らかの解析を行う必要があります。

解決策2

パーシャルのコントロールをビューの外に移動し、コントローラーに配置します。

if($someCondition) {
    $this->view->show('header.php', 'sidebar.php', 'index.php', 'footer.php');
}
else {
    $this->view->show('header.php', 'index.php', 'footer.php');
}

問題:プレゼンテーションロジックの大部分をコントローラーの領域に移動します。ビューがヘッダーを含めるかどうかを決定するのは、私にとってより自然なようです。実際、私が見つけることができるすべてのPHP MVCチュートリアルには、コントローラーではなくビューの制御下にあるパーシャルがあります。

解決策3

ビューを複製し、サイドバーが含まれるようにクローンを変更します。次に、コントローラーに条件付きでどちらかをロードできます。

if($someCondition) {
    $this->view->show('indexWithSidebar.php');
}
else {
    $this->view->show('index.php');
}

問題:コードの重複。条件付きでロードする必要のあるサイドバーが2つあるとどうなるか考えてみてください。次に、私は必要になりますindex.php, indexWithSidebar1.php, indexWithSidebar2.php, indexWithSidebar1And2.php。これは、すべての条件で悪化するだけです。サイドバーを部分的に取り出すことの全体的なポイントは、とにかくそれを複製することを避けることであり、このアプローチはポイントを打ち負かすように思われることを覚えておいてください。

これらの解決策のいずれかが「正しい」解決策ですか。もしそうなら、どうすればそれらの問題を克服できますか?そこにもっと良いアプローチはありますか?

4

2 に答える 2

1

ただし、MVCデザインパターンでは、プレゼンテーションロジックをビューに保持し、ビジネスロジックをコントローラーに保持する必要があります。

IMHO:アーキテクチャの観点から、私はビジネスロジックをコントローラーの外に押し出します。サービスを使用して、データ取得用のすべてのビジネスロジックとリポジトリを処理します。サービスはリポジトリを呼び出してから、すべてのビジネスロジックが決定されたデータモデルを返します。返されたデータは、モバイルアプリ、Windowsアプリ、Webアプリなど、あらゆる種類のアプリケーションで使用できる(使用できるはずです)ため、実際にはUIロジックである外部のロジック(これを表示、非表示)。

コントロールに拡張ヘルパーメソッドを使用できます。サイドバーをレンダリングしたくない場合は、パーシャルのモデルでEmptyResult()を返すことができます。または、もっと簡潔に:

<% Html.RenderAction<MyController>(x => x.Sidebar({params})); %>

そして、コントローラーで:

public ViewResult Sidebar({params})
        {
            SidebarModel model = new SidebarModel();

            //...get/build model

            if ({someCondition})
            {
                return View("MySidebarPartialView", model);
            }


            return new EmptyResult();

        }
于 2010-08-31T19:28:38.473 に答える
1

コントローラーに条件を評価させ、結果をビューに渡します。次に、ビューはパーシャルを含めるかどうかを決定できます。

たとえば、コントローラーは、変数$fooが null でないかどうかを確認できます。モデルのプロパティを介して、比較の結果をビューに渡します$model->isFooed。この場合、ビューは の値に基づいてサイドバーを表示できます$model->isFooed

于 2010-08-31T19:05:25.327 に答える