Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP - How to do reverse routing with slug?

I am using CakePHP 1.3. I have a Product model. on the DB table among others there are id and slug fields.

If I have a product that is id:37 and slug:My-Product-Title I want the URL for the product to be:

products/37/My-Product-Title

Instead of the standard:

products/view/37

I created a route that looks like this:

Router::connect(
    '/products/:id/:slug',
    array('controller' => 'products', 'action' => 'view'),
    array('pass' => array('id'), 'id' => '[0-9]+')
);

Now I can go to http://server/products/37/My-Product-Title and it takes me to the right place.

But How do I get reverse routing to automatically build the correct URL in $HtmlHelper->link?

When I use:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);

It still outputs the standard products/view/37 url.

like image 803
JD Isaacks Avatar asked Feb 24 '11 19:02

JD Isaacks


1 Answers

I don't believe that it's possible to be done auto-magically. The helper is just an "helper" who builds the link from the given parameters.

So the easiest method is to add another parameter in your link like so:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, $slug)
);

where the $slug is the data from the slug field.

Probably it could be done your idea, but you need to break the MVC pattern very badly :)

Edit:

Reading your question again I understood it well. See how should be done:

in your router.php add the following rule:

Router::connect(
    '/product/*',
    array('controller' => 'products', 'action' => 'view')
);

Please note that it's /product/* rather than /products/*

Your link should be done like this:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, 'my-product-title')
);

and the link would look like:

http://yourdomain.com/product/37/my-product-title

For me doing your suggestion is bad practice. Also I don't think it's good from SEO point of view redirecting always the user.

like image 155
Nik Chankov Avatar answered Oct 02 '22 13:10

Nik Chankov