laravel中的RESTful尾随斜线路线

时间:2013-02-13 10:08:22

标签: php rest laravel

我在Laravel 3 RESTful api项目中有以下路线

Route::delete('/(:any)', 'resources@destroy');

Route::delete('users/(:any)', 'users@destroy');

我遇到的问题是当用户向/ users /

发送删除请求时

我想要发生的是使用参数users@destroy调用null路由。在我的控制器中,我对尝试删除null资源的用户有例外。

似乎正在发生的是使用参数resource@destroy调用users路由。这显然会对删除用户资源产生不良影响。

我知道我可以修改我的.htaccess但技术上/ users /确实属于用户控制器而不属于资源控制器。我想保持这种关系。

我想知道是否有一种简单的方法可以在Laravel中解决这个问题?

编辑:让上述方法得到以下答案。现在我的get路线出错了

Route::get('users/(:any?)', 'users@show');
Route::get('users', 'users@index');

/ users和/ users /都调用了我不想要的用户@index。

我需要GET / users转到用户@index和GET / users /转到用户@ show with null parameter

2 个答案:

答案 0 :(得分:1)

我通过在路线中添加过滤器来处理尾随斜线

Route::group(array('before' => 'trailingslash'), function()
{
   //routes in here
});

Route::filter('trailingslash', function() {
    $current = URI::full();
    if(substr($current, -1) == '/'){
        return return Response::error('404');
    }
});

答案 1 :(得分:0)

您需要考虑的一点。

  

路由的定义没有正斜杠。唯一的例外是默认路由,它只用前斜杠表示。

因此Route::delete('/(:any)', 'resources@destroy')会导致意外结果。

此外,您的订单有误。

(:any)也会匹配user,并会将请求发送给resources控制器。

所以你需要做的是,

  • 更改顺序(使其反转)。
  • 根据规则更改resources的路线。比如resources/delete等......
  

我想要发生的是使用参数null调用users @ destroy route。在我的控制器中,我有一个例外,用户试图删除空资源。

执行此操作,(在进行上述更改后....)

user/(:any)的路线更改为user/(:any?),这将使第2段可选。

之后,直截了当。

$foo = URI::segment(2, null);
//Rest will follow.

修改

现在,以下代码,

Route::get('users/(:any?)', 'users@show');
Route::get('users', 'users@index');

没有任何意义。

如果我输入user,路由器会假设采取什么?

user@show没有可选细分或user@index

路由的设计使其消除了歧义。你正朝着相反的方向前进,让它变得模棱两可。

只做一条简单的路线。

喜欢show

  user/show

删除

  user/delete

修改

  user/edit

等......

您正在应用的路由类型对于用户和开发人员来说都很混乱,因为它带有歧义。