【问题标题】: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。
- 输入和演示
型号
- 包含应用程序的业务逻辑
- 您数据库中的所有数据都将驻留在哪里。
控制器