添加新产品时cakephp中的动态路由

添加新产品时cakephp中的动态路由,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我想在我的cakephp网站上做动态路由,我有一个名为products的表。最初我为每个产品做了静态路由,但当添加新产品时,它会产生一个问题,因为有人必须手动输入每个新产品的路由路径,这似乎对用户不太友好。最初我是这样做的 Routing::connect('/portfolio/product_name1',array( 'controller'=>'products','action'=>'view',1)); Routing::connect('/portfolio/produ

我想在我的cakephp网站上做动态路由,我有一个名为products的表。最初我为每个产品做了静态路由,但当添加新产品时,它会产生一个问题,因为有人必须手动输入每个新产品的路由路径,这似乎对用户不太友好。最初我是这样做的

Routing::connect('/portfolio/product_name1',array( 'controller'=>'products','action'=>'view',1));
Routing::connect('/portfolio/product_name2',array( 'controller'=>'products','action'=>'view',2));
Routing::connect('/portfolio/product_name3',array( 'controller'=>'products','action'=>'view',3)); 

等等。但是如果有人在一段时间后添加了另一个产品,他们也必须更改路由文件。有没有一个选项可以让它保持动态?My view()操作以id为参数,如何从函数view()中获取url中另一个名为productname的字段。是否可以通过“命名”参数实现此目的。我从蛋糕面包店查看了“路由”,但这一切似乎让我很困惑。有人能帮我解决这个问题吗

在我看来,你似乎想做一些slug路由。基本上,你的路线应该是这样的

Routing::connect('/portfolio/:slug',
                  array( 'controller'=>'products', 'action'=>'view'),
                  array('pass'=>array('slug'));
我之所以称之为slug,是因为这是一个更为熟悉的术语,但您可以将其命名为
:product name
或任何您想要的名称。如果您搜索“cakephp slug”,您将在所需内容中找到更多指导

无论如何,该路由将把像
portafolio/good product
这样的URL定向到

ProductsController->view('good-product')
在查看操作中,您可以将产品名称(slug)转换为id。为此,在模型中创建一个函数,如
slugToId
,并从控制器调用它

public function view($slug) {
    $productID = $this->Producto->slugToId($slug);
}
在模型中,对
slugToId
函数进行简单的查找。嗯,这个函数在模型中不是必需的,但是更好的做法是,特别是如果你想在其他模型中做slug的事情,你可以重用这个函数

现在,您还可以使用反向路由,因此

$this->redirect(array('controller'=>'products',
                      'action'=>'view',
                      'slug'=>'super-awesome-product'))
将调用url
cake.com/portfolio/super awesome product

阅读slugs,您不需要像这里建议的那样做很多更改,但它是一个很好的指南