在函数中传递参数时如何正确路由?

时间:2012-02-23 20:21:26

标签: cakephp routes cakephp-2.0

我有一条路线:

Router::connect('/restaurants/*', array('controller'=>'restaurants', 'action' => 'view'));

当用户访问site.com/restaurants/Seafood时,他们会获得海鲜餐馆列表。好吧,问题是,现在我想在我的控制器中添加一个编辑功能,并且site.com/restaurants/edit/4路由到我的控制器的视图功能。如何告诉我的路线发送/餐馆/编辑到edit()函数?

我理解贪婪的明星是个坏主意,但我不知道如何让我的函数view()没有它正常工作。这是我的观看代码:

public function view($type=null) {
$this->set('title', $type.' restaurants in and near Gulf Shores');
$this->paginate['Restaurant']=array(
   'limit'=>9,
    'order'=>array(
        'id'=>'asc'
        ),
    'joins' => array(
         array( 
           'table' => 'cuisines_restaurants', 
           'alias' => 'CuisinesRestaurant', 
           'type' => 'inner',  
           'conditions'=> array('CuisinesRestaurant.restaurant_id = Restaurant.id') 
         ), 
         array( 
           'table' => 'cuisines', 
           'alias' => 'Cuisine', 
           'type' => 'inner',  
           'conditions'=> array( 
               'Cuisine.id = CuisinesRestaurant.cuisine_id'
               )
           )
      )
    ); 
$this->set('restaurantType',$this->paginate($this->Restaurant, array('cuisine_type'=>$type)));

}

2 个答案:

答案 0 :(得分:2)

这是做这样的路线的正确方法:

Router::connect(
    '/restaurants/:type',
    array('controller'=>'restaurants', 'action' => 'view'),
    array(
        'pass'=>array('type'),
        'type'=>'regexHere'
    )
);

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

这种方式的另一个好处是你可以根据正则表达式进行路由,所以如果有人试图访问你的网站/餐馆/编辑/ notanumber将不会被路由到编辑页面。

答案 1 :(得分:0)

如果您需要实现此功能的控制器数量较少,则可以采用“快速”“脏”方式,即显式路由:

Router::connect('/restaurants/edit/*', array('controller'=>'restaurants', 'action' => 'edit'));

(确保将此行放在routes.php中贪婪的上面)

如果您需要此功能用于许多控制器和操作,那么更多功能的路由将更有意义。