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

Php 如何根据对象类型选择视图?,php,oop,model-view-controller,Php,Oop,Model View Controller,我有4个对象(小说、短篇小说、非小说、科幻),所有这些对象都是从一个图书基类扩展而来的。用户可以查看图书详细信息页面,该页面应根据图书类型显示不同的详细信息集。因此,理想情况下,我可以有4个diff-view脚本,这些脚本将根据所选书籍的类型进行调用。我该怎么做?我应该在每个对象中存储到视图脚本的链接吗?我是否应该在控制器操作中使用switch语句来确定正确的视图?将视图脚本/文件命名为带有详细信息后缀的对象(例如novel_details.php) 因此,在显示/渲染视图时,可以使用细节suf

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

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

因此,在显示/渲染视图时,可以使用细节sufix解析对象的名称

$this->render( $object->name."_details.php");*

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

您是自己实现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种书?它们到底有什么区别?如果它们只对它们包含的元数据类型有所不同,那么您可以考虑将这种差异封装在某种程度上,而不是向下移动类型层次结构。(例如,如果影响不同类型书籍的方法相似,您可以简单地排除适用于特定书籍类型的任何算法,并使用对象组合将该功能包括在类中)。我认为这还可以简化视图结构,从而间接地为您提供一个更清晰的解决方案。

您可以

$bookTypeToView = array(
   'novel' => 'novel.php',
   'short_story' => 'short.php'
   ...
);
然后做一些类似于

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

考虑到我理解您的情况,我建议使用switch.Rails和类似的框架来实现这一点,而不是通过类名->某个文件的静态映射,而是通过通常涉及复数化和基本路由器的约定。例如,route/novel/:novel_id映射到novel.tpl.php视图和NovelController.php以及Novel.php模型文件。