【问题标题】:Zend Framework - When to use viewscripts/partials vs view helpersZend Framework - 何时使用 viewscripts/partials 与 view helpers
【发布时间】:2010-03-05 19:49:38
【问题描述】:

我正在为我们的应用程序创建一个显示对象库。它们在各种视图中呈现许多常见对象(用户、对话、消息等)的 html。通过视图,我的意思是对象可以使用不同的标记返回自身的不同“缩放级别”。

一些显示对象包含其他要渲染的显示对象,例如。用户列表对象在特定视图中呈现用户对象(此特定视图将它们吐回到列表项中,以便它们适合列表)

我正在尝试将这些转移到 ZF 中的正确处理方式中,但我无法决定这些是否应该都是视图助手,或者它们是否都是视图脚本/部分。

只是让他们查看脚本并使用 ->render() 进行渲染似乎有点脏,因为我想传递给他们的任何信息或参数都必须分配给视图对象。

Partials 似乎更正确一些,除了不确定是否适合在这些中执行显示逻辑(如果“showNotificationStatus”作为参数传递,则呈现此跨度)。或者,如果它的局部用于呈现其他局部(呈现用户对象的用户列表)。

视图助手似乎可能是正确的方法,但我不知道这是否过度使用视图助手。每个对象都可以是一个视图助手并接受一个 objectview 参数,因此它知道要在哪个缩放级别/容器中呈现自己,或者每个 objectview 甚至可以是它自己的助手(因此对象内没有大的 switch 语句)。视图的一个好处是您可以传递参数,并且如果您需要该级别的某些内容,它仍然可以访问视图上下文。

其中大多数将接受模型,其中一些需要一些额外的参数才能知道要做什么(例如上面的 showNotificationStatus)。什么是合适的工具?

【问题讨论】:

    标签: php zend-framework


    【解决方案1】:

    partials 的核心思想之一是它们的目的是尽可能地可重用 - 因此它们有自己的变量范围。我喜欢使用 partials 作为一小段 HTML 的相当愚蠢的容器。除了几个if()foreach() 语句之外,没有其他主要逻辑。

    如果我需要严肃的逻辑 - 我会使用助手。助手应该负责处理逻辑和调用渲染方法。我知道在 Rails 世界中,助手倾向于封装少量逻辑,例如处理链接或图像标签的构造。这很好,但我认为在 ZF 中让它们变得更复杂没有任何害处。我基本上使用它们将我的业务对象转换为视图。

    我认为同时使用 partials 和 helpers 的最佳方式是让 helpers 设置数据,然后将其传递给 partials。这样,您的 HTML 就很容易维护(而且我怀疑每次有人键入 echo "<a href='". $my_link . '"/>" 时,一只小猫会死在某个地方)。

    编辑(详细说明):

    关于助手要记住的一点是,它们可以被视为普通类,使用带参数的构造函数并具有私有成员。因此,当您实例化一个助手时,您可以创建一个业务对象,然后拥有多个渲染 HTML 的方法(通过部分)。

    所以在我看来:

    <?php $helper = $this->_helper->MyUserHelper($users); ?>
    <ul>
      <?php $helper->user_list(); ?>
    </ul> 
    

    这里,user_list() 方法返回一个包含所有正确数据的 &lt;li&gt; 元素的集合。

    我的助手可能如下所示:

    class MyWidgetHelper 
    {
      private $_widget;   
    
      public function __construct($users)
      {
         $this->_users = $users;
      }
    
      public function user_list()
      {
         // do any necessary logic here
         // then return the html that gets rendered. 
         // you can call a partial from here, and it just returns an HTML string.
         return $this->_view->partial('partials/_user_item.phtml', array('users' => $users)
      }
    }
    

    【讨论】:

    • Bryan 我认为这是非常好的信息。有机会可以详细说明一下吗?假设您有一个可以在一堆不同缩放级别(详细)表示的业务对象。您是否有一个助手,可以根据您传递的参数呈现不同的部分?许多具有相应部分的助手?基本上,您通常是在看 1 对 1 的关系吗?局部视图利用其他视图助手是否很酷? (想象一个对话,其中包含一个用户列表。需要在对话中呈现部分用户。)
    • 我在上面的回复中添加了一个示例。在我的示例中,我使用助手来控制部分,但我不明白为什么你不能反过来做。我只是希望尽可能地让我的 HTML 没有 php 逻辑。
    • 优秀。非常感谢布莱恩!
    • 谢谢,这是我见过的最好的分解和解释。我刚刚解决了这个问题并想到了相同的解决方案,现在我确信这是同时使用部分和视图助手的正确方法。
    • 我同意@AndreLiem 的观点,这是一个明确的解释,我也打算这样做。谢谢你的好答案。来自我的 +1
    【解决方案2】:

    助手用于逻辑(例如将对象转换为数组),部分用于装饰逻辑(将递归数组显示为&lt;ul&gt; 树)。

    请记住,您也可以使用$this-&gt;render('anyfile.ext')include()

    【讨论】:

    • 对我来说模糊了这条线的一件事是,ZF 附带了一些帮助程序,这些帮助程序正是用于从提供的数据创建 html 元素。查看zendframework.com/manual/1.10/en/zend.view.helpers.html 上的所有表单助手,例如。 formCheckbox 使用您传递给它的数据创建一个复选框
    • Helper 可能有不同的 HTML 输出,使用setPartial()。当运行 partial 太昂贵(或者您确定每次输出都相同)时,在帮助程序中硬编码 HTML 会更容易。如果部分未设置,只需实现 setPartial() 并回退到默认标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多