如何根据对象类型选择视图?

时间:2011-04-11 01:35:32

标签: php oop model-view-controller

我有4个对象(小说,短篇小说,非小说,科幻),所有这些都从Book基类扩展而来。用户可以查看书籍详细信息页面,该页面应根据书籍类型显示不同的详细信息。因此,理想情况下,我可以根据所选书籍的类型调用4个差异视图脚本。我该怎么做?我应该在每个对象中存储指向视图脚本的链接吗?我应该在控制器操作中有一个switch语句来确定正确的视图吗?

3 个答案:

答案 0 :(得分:1)

将视图脚本/文件命名为具有详细信息后缀的对象(例如novel_details.php)。

因此,当您显示/呈现视图时,您将使用详细信息sufix

解析对象的名称
$this->render( $object->name."_details.php");*

编辑:*这完全取决于您使用的是哪个MVC框架。

答案 1 :(得分:0)

您是自己实施MVC还是使用预先存在的框架? Rails类型的框架通常在类/方法和请求之间有一个很好的映射,例如:

GET /book/view/id/1 --> Book::view(1)

根据模型的结构,这可能会映射到书籍GUID;或者,如果你坚持这种类型的层次结构,你可能更喜欢这样的东西:

GET /book/view/type/novel/id/3 --> Novel::view(3)

id指的是小说,而不是书,id。也:

GET /novel/view/id/3 --> Novel::view(3)

可以完全相同的工作。

也许更有针对性,你应该赞成作文而不是继承;有没有理由有4种类型的书?他们真的有什么不同?如果他们只是对它们包含的元数据类型有所不同,您可以考虑以某种方式封装该差异,而不是向下移动类型层次结构(例如;如果影响各种类型的书籍的方法相似,您可能会简单地分解出适用于特定书籍类型的任何算法,并使用对象组合在您的类中包含该功能)。我认为这也可以让您简化视图结构,间接地为您提供更清晰的解决方案。

答案 2 :(得分:0)

你可以......

$bookTypeToView = array(
   'novel' => 'novel.php',
   'short_story' => 'short.php'
   ...
);

然后做类似的事情......

$this->view = isset($bookTypeToView[$book['type']]) ? $bookTypeToView[$book['type']] : 'default';