CakePHP - How to do reverse routing with slug?

心已入冬 提交于 2019-12-01 05:54:55

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.

For routing:

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

Your links should look like this:

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

You have to add additional (key => value) to your array for each :param in your routing. Then magic will work

You should look at the following post regarding custom route classes.

The slug data doesn't need to be involved with the database at all - the field is a fake field used to simplify logic and lookups. This solution allows you to reverse route slugs, without needing a slug field in the models table.

http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

I am not sure how bad this is but with the following code in the ProductsController:

function view($id)
{
    if( isset($_SERVER) && stristr($_SERVER["REQUEST_URI"],'view/') )
    {
        $this->Product->id = $id;
        $slug = $this->Product->field('slug');
        $this->redirect($id.'/'.$slug);
    }
    $data = $this->Product->find('first', array('conditions' => array('Product.id' => $id)));
    $this->set("data", $data);
}

If the page is accesses via /view/id it automatically redirects them to the current page using /id/slug

Now I can just use the default link scheme:

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

and they will be redirected to the right URL.

Only problem is I am not sure how bad it is to have a redirect happening every time a user visits a product page?

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!