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