PHP MVC一般问题

时间:2010-02-15 14:33:21

标签: php model-view-controller frameworks doctrine

我正在为特定的PHP应用程序构建一个小型MVC framewrok - 使用Doctrine作为ORM。 我想知道管理前端菜单的最佳做法是什么。

我的应用程序有3个菜单(水平菜单,左菜单,底部/页脚菜单),可以由站点Admin编辑(菜单存储在Doctrine NestedSet中)。

应该在哪里找到调用和呈现菜单的代码?每个控制器应该能够根据其要求调用菜单的创建(例如,对于控制器,用户不希望显示左侧菜单)。

在菜单模型中找到此功能是不合适的我猜...

2 个答案:

答案 0 :(得分:2)

控制器应调用代码来呈现菜单,并在需要时使用模型中数据库中的任何数据。然后将结果发送到您的视图。

这是一个小故障

视图

  • 处理网页的内容
  • 以模板的形式组合HTML和PHP。
  • 输入和演示

模型

  • 包含应用程序的业务逻辑
  • 数据库中的所有数据都将驻留在哪里。

控制器

  • 接收输入并请求相应模型的响应。

答案 1 :(得分:1)

我目前在我的MVC框架中实现了多层菜单(特别是Symfony,但这种模式应该传输),方法是将渲染设置在一个单独的include(Symfony术语中的组件)中,递归调用自身来呈现每个层。 include的控制器从模型请求当前层,然后将其传递给视图。 include的视图呈现每个返回的元素并再次调用include来打印所有子元素(如果可用),传入当前元素的ID以查询模型中的父值。

就条件显示菜单而言,我会将其保留在顶级视图中,因为它听起来像是视图特定的。

<强>模型

你应该善于使用Doctrine的findByX方法来查询当前层的项目。我的架构中的字段名为parent,因此我会使用findByParent

包含控制器

$items = Doctrine::getTable('TopMenuItems')->findByParent( isset($parent) ? $parent : null) ) // null for initial call to grab top-tier elements, recursion should pass in new parent for children

包含视图

<?php foreach($items as $item) : ?>
  // echo HTML element for nav item
  <?php $parent = $item['parent']; include('top_menu.php'); // call nav again to print this item's children ?>
<?php endforeach; ?>

主视图

<?php if($user->wantsTopMenu()) : ?>
<?php include('top_menu.php'); ?>
<?php endif; ?>

希望有所帮助。