Take the 2-minute tour ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

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?

share|improve this question
add comment

1 Answer

up vote 2 down vote accepted

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
/:product/comments
/about

You should check out the Slim Framework: http://www.slimframework.com/

I've used it just for routing when performance was a crucial requirement.

share|improve this answer
    
+1 (not enough rep), this makes sense to me. Btw, what does :product mean? I've seen this markup before. Why not $product? –  Sam Selikoff Feb 1 '13 at 15:23
1  
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
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.