0

我想在我的 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)); 

x 产品以此类推。但如果有人在一段时间后添加另一个产品,他们也必须更改路由文件。有没有可以保持动态的选项?我的 view() 操作将 id 作为参数,我如何从函数 view() 的 url 中获取另一个名为 productname 的字段。是否可以通过“命名”参数来做到这一点。我通过 cake 中的“路由”面包店,但这一切对我来说似乎很混乱。有人可以帮我解决这个问题吗?

4

1 回答 1

0

在我看来,你想做一些 slug 路由。基本上,您的路线需要像这样

Routing::connect('/portfolio/:slug',
                  array( 'controller'=>'products', 'action'=>'view'),
                  array('pass'=>array('slug'));

我称它为 slug 是因为它是一个更熟悉的术语,但您可以命名它:product-name或任何您想要的名称。如果您搜索“cakephp slug”,您将找到更多关于您想要的指导。

portafolio/good-product无论如何,该路线将引导网址

ProductsController->view('good-product')

在视图操作中,您可以将该产品名称 (slug) 转换为 id。为此,在模型中创建一个函数,例如slugToId从控制器调用它

public function view($slug) {
    $productID = $this->Producto->slugToId($slug);
}

在模型中,一个简单的 find 就可以实现该slugToId功能。嗯,该函数在模型中不是必需的,但更好的做法是,特别是如果您想在其他模型中做 slug 的事情,您可以重用该函数。

现在,你也可以使用反向路由,所以调用

$this->redirect(array('controller'=>'products',
                      'action'=>'view',
                      'slug'=>'super-awesome-product'))

将调用 url cake.com/portfolio/super-awesome-product

阅读这篇关于 slugs 的教程,你不需要做那里建议的那么多的改变,但它是一个很好的指南。

于 2013-07-03T14:16:04.593 回答