# Trying to understand appropriate routing in MVC

I am learning MVC, and trying to understand routing.

I understand that if I want to show an individual blog post for site.com/54, my route would be something like

//index.php
$controller = new Controller(); if ( preg_match("#/(0-9.)#",$uri, $matches) ) {$controller->showAction($matches[1]); }  which would lead to my controller //controllers.php class Controller { private function showAction($id) {
$post = getPostById($id);
$view = new View('views/show.php'); } }  And, on the other hand, a sensible thing to do for different static pages is perhaps //index.php ... } elseif ($uri == '/about') {
$controller->aboutAction(); } elseif ($uri == '/contact') {
$controller->contactAction(); } elseif ($uri == '/') {
$controller->indexAction(); } else {$controller->missingAction();
}


My question is, what about the in-between? For example, apple.com/ipad/overview/ and apple.com/ipad/features/. They are different pages, so it seems like the latter is sensible (i.e. unique controller method for each page). But then, when you're on /overview, you still need to know you're a sub-page of /ipad (so you can highlight the iPad button in the navigation). If you did the first method (regex parsing), you'd know that (i.e. you could use $matches[1] when constructing your navigation). If you use the second method, it seems like in your view you'd have to do something like $current_product = 'ipad' so your nav would know about it. But this could get cumbersome.

What's the appropriate method?

-

Have you thought about calling the overview only when the URI ends in "overview" and preceded by a product slug?

$controller = new Controller(); if ( preg_match("#^/([a-zA-Z0-9_-]+)/overview/?$#", $uri,$matches) ) {
$controller->showOverview($matches[1]);
}


This way, you define your routes with the following assumption:

/:product
/:product/specs

Sam, the notation :key is used by many routing frameworks to denote a named parameter in the URL. Instead of using the regular expression (?<product>[a-zA-Z]+), a framework like Slim will allow you to say :product and pass that value to your controller's action. –  Dimitry Feb 1 '13 at 20:01