JD *_*cks 5 php model-view-controller cakephp url-routing slug
我正在使用CakePHP 1.3.我有一个产品型号.对等的数据库表有id和slug领域.
如果我有一个产品,是id:37和slug:My-Product-Title我想要的网址为产品是:
产品/ 37 /我 - 产品名称
而不是标准:
产品/视图/ 37
我创建了一个如下所示的路线:
Router::connect(
'/products/:id/:slug',
array('controller' => 'products', 'action' => 'view'),
array('pass' => array('id'), 'id' => '[0-9]+')
);
Run Code Online (Sandbox Code Playgroud)
现在我可以去http://server/products/37/My-Product-Title,它带我到正确的地方.
但是如何获得反向路由以自动构建正确的URL $HtmlHelper->link?
我用的时候:
echo $html->link(
'Product 37',
array('controller'=>'products', 'action' => 'view', 37)
);
Run Code Online (Sandbox Code Playgroud)
它仍然输出标准products/view/37网址.
我不相信它可以自动神奇地完成.帮助程序只是一个"帮助者",它根据给定的参数构建链接.
所以最简单的方法是在链接中添加另一个参数,如下所示:
echo $html->link(
'Product 37',
array('controller'=>'products', 'action' => 'view', 37, $slug)
);
Run Code Online (Sandbox Code Playgroud)
$ slug是slug字段中的数据.
可能它可以完成你的想法,但你需要非常严重地打破MVC模式:)
编辑:
再次阅读你的问题,我理解得很清楚.看看应该怎么做:
在您的router.php中添加以下规则:
Router::connect(
'/product/*',
array('controller' => 'products', 'action' => 'view')
);
Run Code Online (Sandbox Code Playgroud)
请注意,它是/ product/*而不是/ products/*
您的链接应该像这样完成:
echo $html->link(
'Product 37',
array('controller'=>'products', 'action' => 'view', 37, 'my-product-title')
);
Run Code Online (Sandbox Code Playgroud)
并且链接看起来像:
http://yourdomain.com/product/37/my-product-title
Run Code Online (Sandbox Code Playgroud)
对我来说,你的建议是不好的做法.另外我认为从SEO的角度来看,总是用户重定向是不错的.