【问题标题】:PHP MVC general questionPHP MVC 一般问题
【发布时间】:2011-01-17 00:24:54
【问题描述】:

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

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

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

我想在菜单模型中定位这个功能是不合适的......

【问题讨论】:

    标签: php model-view-controller frameworks doctrine


    【解决方案1】:

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

    至于调节菜单的显示,我会将其保留在您的顶级视图中,因为它听起来像是特定于视图的。

    型号

    你应该很好地使用 Doctrine 的 findByX 方法来查询当前层的项目。我的架构中的字段称为parent,因此我将使用findByParent。

    Include 的控制器

    $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; ?>
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

      这里有一个小细节

      查看

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

      型号

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

      控制器

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

      【讨论】:

      • 比如View会调用相关的Menu HTML模板?
      • 是的,视图会显示 HTML 模板。
      猜你喜欢
      • 2010-11-01
      • 2014-06-28
      • 2018-05-06
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多