【问题标题】:RESTful trailing slash routes in laravellaravel 中的 RESTful 斜杠路径
【发布时间】:2013-01-28 20:20:31
【问题描述】:

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

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

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

我遇到的问题是当用户向 /users/ 发送删除请求时

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

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

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

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

编辑:将上述内容与以下答案一起使用。现在我的获取路线有错误

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

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

我需要 GET /users 去 users@index 和 GET /users/ 去 users@show with null 参数

【问题讨论】:

    标签: php rest laravel


    【解决方案1】:

    您需要考虑的一点。

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

    所以Route::delete('/(:any)', 'resources@destroy') 会导致不希望的结果。

    另外,您的订单有误。

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

    所以你需要做的是,

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

    我想要发生的是 users@destroy 路由是用参数 null 调用的。在我的控制器中,尝试删除空资源的用户出现异常。

    为此,(在进行上述更改后......)

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

    在那之后,直截了当。

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

    编辑

    现在,下面的代码,

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

    没有任何意义。

    如果我输入user,路由器应该采取什么?

    user@show 没有可选段或user@index

    路线的设计是为了消除歧义。你正朝着相反的方向前进,这一切都变得模棱两可。

    只做一个简单的路线。

    喜欢节目

      user/show
    

    删除

      user/delete
    

    编辑

      user/edit
    

    等等……

    您所应用的路由类型会导致用户和开发人员感到困惑,因为它带有歧义。

    【讨论】:

    • 谢谢。删除路由现在工作得很好。我现在确实有另一个问题。有更新的问题。
    • 感谢您的更新。我明白你的意思,但我无法实现你的解决方案,因为我正在尝试构建一个 RESTful API。用户/删除,用户/编辑违反 REST。我必须能够使用 DELETE 用户、PUT 用户。你知道另一种让 GET 用户和 GET 用户/去不同路线的方法吗?
    • 两者的方法相同。所以只有一个会运行。另一个永远不会触发。
    • 是的,我知道。我想知道有没有办法让它们通过其他方式触发?我需要某种方式让 laravel 在 / 之后识别 null
    【解决方案2】:

    我通过向我的路线添加过滤器来解决尾部斜杠

    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');
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-01
      • 2012-11-16
      • 2017-03-16
      • 1970-01-01
      • 2020-11-20
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多