什么是放置视图函数的最佳位置


What is the best place to put view function?

我有一个层次数组:

array(
  'id' => 4, //id of current element
  'parent' => 2, //id of parent element
  'value' => '', //some value
  'children' => array() //array of similar arrays
)

每个元素可以包含若干个元素,这些元素可以包含若干个元素,等等。可以这么说,遍历它的最佳方法是使用function,它将调用自己来处理子进程:

function print_menu_hierarchy($hierarchy, $depth = 0) {
    foreach ($hierarchy as $item) {
        echo '<tr>';
        echo '    <td>' . $item['id'] . '</td>';
        echo '    <td>' . str_repeat('&nbsp;', $depth * 6) .  $item['value'] . '</td>';
        echo '</tr>';
        if (count($item['children'])) {
            print_menu_hierarchy($item['children'], $depth + 1);
        }
    }
}

我的问题是:把这个函数放在哪里?

维护MVC,它必须是视图的一部分。所以,无论是帮助器还是模板。

Helper是显而易见的,但是将这个函数放在Helper中会使修改视图变得更加困难。每次我要更改模板中的某些内容时,我也必须更改helper。此外,这个函数变得越来越大,很难保持它的整洁。

模板也是一个糟糕的选择,定义函数应该在其他地方完成。

谁有更好的主意把这个放在哪里?

(我使用symfony 1.4)

虽然我不清楚您使用的是什么框架,但函数本身-正如您自己所说-不属于视图。这个函数应该放在应用程序的helper部分中。您需要做的唯一更改就是从这个辅助函数中调用单个项目的视图,而不是将回显硬编码到层次结构爬虫中。像这样:

function print_menu_hierarchy($hierarchy, $depth = 0) {
    foreach ($hierarchy as $item) {
        call_view_function('view_name_for_menu_item', array('item' => $item, 'depth' => $depth));
        if (count($item['children'])) {
            print_menu_hierarchy($item['children'], $depth + 1);
        }
    }
}

这个视图看起来像:

<tr>
  <td><?php echo $params['item']['id']; ?></td>
  <td><?php echo str_repeat('&nbsp;', $params['depth'] * 6) . $params['item']['value']; ?></td>
</tr>

我会让它成为一个助手。当您更改模板时,不可避免地要修改它。如果它是一个大型函数,那么helper是最好的地方。这意味着它也可以在不同的地方使用。

另外,MVC是用来帮助你的。这是一本指南。不要让它阻碍你完成工作。每当你为把东西放在哪里而烦恼的时候,你就没有真正解决问题。