MVC パラダイムを使用してアプリをリファクタリングしようとしています。
私のサイトにはグラフが表示されます。URL の形式は次のとおりです。
- app.com/category1/chart1
- app.com/category1/chart2
- app.com/category2/chart1
- app.com/category2/chart2
すべてのリクエストを index.php にルーティングするために Apache Rewrite を使用しているので、PHP で URL 解析を行っています。
active
特定のページが選択されたときに、ナビゲーション リンクにクラスを追加するという永続的なタスクに取り組んでいます。具体的には、カテゴリ レベルのナビゲーションとチャート レベルのサブ ナビゲーションの両方があります。私の質問は、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>
サブナビゲーションも同様で、current_category ではなく current_chart をチェックしていました。
以前は、解析中に、 によって爆発$_SERVER['REQUEST_URI']
し、断片をと/
に分割していました。私はindex.phpでこれをやっていました。今、これはフォントコントローラーの精神に合わないと感じています。Symfony 2 の docsなどの参照から、各ルートには独自のコントローラーが必要なようです。しかし、その後、現在のカテゴリとチャートを、テンプレート ファイル自体 (MVC の精神にあるとは思えない) 内、またはモデル内の任意の関数内 (その後、複数のコントローラーから呼び出す必要があり、これは一見冗長です)。$current_category
$current_chart
ここでのベストプラクティスは何ですか?
更新: これが私のフロントコントローラーの外観です:
// 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 であることを認識しているため、それをそのまま渡す必要があるようです。これは私がつまずいているところです。