放置视图功能的最佳位置是什么?

时间:2011-04-20 10:04:45

标签: php model-view-controller recursion

我有一个分层数组:

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

每个元素都可以包含许多元素,这些元素可以包含许多元素等。可以说,迭代这个元素的最好方法是使用函数,它会调用自己来处理子元素:

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很明显,但是将这个函数放到帮助器上会使修改视图变得更加困难。每次我在模板中更改某些内容时,我都必须更改帮助程序。此外,这个功能越来越大,保持清洁很难。

模板也是不错的选择,定义函数应该在其他地方完成。

任何人都知道在哪里放这个?

(我正在使用symfony 1.4)

2 个答案:

答案 0 :(得分:1)

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

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>

答案 1 :(得分:0)

我会帮助它。当您更改模板时,您将不得不修改它。如果它是一个大功能,帮手是最好的地方。这意味着它也可以在不同的地方使用。

此外,MVC可以帮助您。这是一个指南。不要让它阻止你完成工作。每一刻你都在为放置东西感到苦恼,那一刻你实际上并没有解决问题。