私は「部分的」という用語を使用して、多くのビューで繰り返されるプレゼンテーションコードの小さなセクションを指します。たとえば、サイドバー。ビジネスロジックとプレゼンテーションロジックが混在しているバニラ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
。これは、すべての条件で悪化するだけです。サイドバーを部分的に取り出すことの全体的なポイントは、とにかくそれを複製することを避けることであり、このアプローチはポイントを打ち負かすように思われることを覚えておいてください。
これらの解決策のいずれかが「正しい」解決策ですか。もしそうなら、どうすればそれらの問題を克服できますか?そこにもっと良いアプローチはありますか?