我正在尝试使用 MVC 范例重构我的应用程序。
我的网站显示图表。URL 的格式为
- app.com/category1/chart1
- app.com/category1/chart2
- app.com/category2/chart1
- app.com/category2/chart2
我正在使用 Apache Rewrite 将所有请求路由到 index.php,因此我正在使用 PHP 进行 URL 解析。
I am working on the enduring task of adding an active
class to my navigation links when a certain page is selected. 具体来说,我既有类别级导航,也有图表级子导航。我的问题是,在保持 MVC 精神的同时,最好的方法是什么?
在我重构之前,由于导航变得相对复杂,我决定将它放入一个数组中:
$nav = array(
'25th_monitoring' => array(
'title' => '25th Monitoring',
'charts' => array(
'month_over_month' => array(
'default' => 'month_over_month?who=total&deal=loan&prev='.date('MY', strtotime('-1 month')).'&cur='.date('MY'),
'title' => 'Month over Month'),
'cdu_tracker' => array(
'default' => 'cdu_tracker',
'title' => 'CDU Tracker')
)
),
'internet_connectivity' => array(
'title' => 'Internet Connectivity',
'default' => 'calc_end_to_end',
'charts' => array(
'calc_end_to_end' => array(
'default' => 'calc_end_to_end',
'title' => 'calc End to End'),
'quickcontent_requests' => array(
'default' => 'quickcontent_requests',
'title' => 'Quickcontent Requests')
)
)
);
同样,我需要知道当前类别和正在访问的当前图表。我的主要导航是
<nav>
<ul>
<?php foreach ($nav as $category => $category_details): ?>
<li class='<?php echo ($current_category == $category) ? null : 'active'; ?>'>
<a href="<?php echo 'http://' . $_SERVER['SERVER_NAME'] . '/' . $category . '/' . reset(reset($category_details['charts'])); ?>"><?php echo $category_details['title']; ?></a>
</li>
<?php endforeach; ?>
</ul>
</nav>
并且 sub-nav 是类似的,检查 current_chart 而不是 current_category。
之前,在解析过程中,我正在爆炸$_SERVER['REQUEST_URI']
,/
并将碎片分解为$current_category
and $current_chart
。我在 index.php 中这样做。现在,我觉得这不符合字体控制器的精神。从Symfony 2's docs之类的参考资料来看,似乎每条路由都应该有自己的控制器。但是后来,我发现自己必须多次定义当前类别和图表,要么在模板文件本身(这似乎不符合 MVC 的精神),要么在模型中的任意函数(然后必须由多个控制器调用,这似乎是多余的)。
这里的最佳做法是什么?
更新:这是我的前端控制器的样子:
// index.php
<?php
// Load libraries
require_once 'model.php';
require_once 'controllers.php';
// Route the request
$uri = str_replace('?'.$_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI']);
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && (!empty($_GET)) && $_GET['action'] == 'get_data') {
$function = $_GET['chart'] . "_data";
$dataJSON = call_user_func($function);
header('Content-type: application/json');
echo $dataJSON;
} elseif ( $uri == '/' ) {
index_action();
} elseif ( $uri == '/25th_monitoring/month_over_month' ) {
month_over_month_action();
} elseif ( $uri == '/25th_monitoring/cdu_tracker' ) {
cdu_tracker_action();
} elseif ( $uri == '/internet_connectivity/intexcalc_end_to_end' ) {
intexcalc_end_to_end_action();
} elseif ( $uri == '/internet_connectivity/quickcontent_requests' ) {
quickcontent_requests_action();
} else {
header('Status: 404 Not Found');
echo '<html><body><h1>Page Not Found</h1></body></html>';
}
?>
例如,似乎在调用 month_over_month_action() 时,由于控制器知道 current_chart 是 month_over_month,它应该将其传递。这就是我被绊倒的地方。