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

时间:2013-07-03 05:16:49

标签: cakephp cakephp-2.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作为参数,如何从函数视图()中获取url中另一个称为productname的字段。是否可以通过'named'参数来实现。我从蛋糕中经过'Routing'面包店,但这一切似乎让我很困惑。有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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);
}

在模型中,一个简单的查找将对slugToId函数执行。嗯,这个功能不是必须在模型中,但是更好的练习,特别是如果你想在其他模型中做slug,你可以重用这个功能。

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

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

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

阅读slu {this tutorial,你不需要做那么多的改变,但它是一个很好的指南。