【问题标题】:How to choose a view based on object type?如何根据对象类型选择视图?
【发布时间】:2011-04-11 01:35:31
【问题描述】:

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

【问题讨论】:

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

标签: php oop model-view-controller


【解决方案1】:

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

因此,当您显示/渲染视图时,您会解析带有详细信息后缀的对象名称

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

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

【讨论】:

    【解决方案2】:

    您是自己实现 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种类型的书?他们真的有什么不同?如果它们仅在它们包含的元数据类型上有所不同,您可能会考虑以某种方式封装这种差异,而不是向下移动类型层次结构(例如;如果影响各种类型书籍的方法相似,您可能只需分解出适用于特定书籍类型的任何算法,并使用对象组合将该功能包含在您的类中)。我认为这也可以让您简化视图结构,从而间接地为您提供解决此问题的更清晰的解决方案。

    【讨论】:

      【解决方案3】:

      你可以...

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

      然后做一些类似于...的事情

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

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多