Route :: match()在嵌套组结构中不起作用

时间:2015-07-24 08:24:03

标签: laravel routing laravel-5

我正在创建一个只能通过POST使用的API。我计划使用多个版本的API,因此当前使用 v1 作为网址的一部分。

现在,如果通过GETPUTDELETE进行API调用,我想返回失败响应。为此,我使用Route::match()工作在下面的代码中完全正常:

   Route::group(['namespace'=>'API', 'prefix' => 'api/v1', 'middleware' => 'api.v1'], function() {

        Route::match(['get', 'put', 'delete'], '*', function () {
            return Response::json(array(
                'status' => 'Fail',
                'message' => 'Wrong HTTP verb used for the API call. Please use POST.'
                ));
        });

        // User
        Route::post('user/create', array('uses' => 'APIv1@createUser'));
        Route::post('user/read', array('uses' => 'APIv1@readUser'));
        // other calls

        // University
        Route::post('university/create', array('uses' => 'APIv1@createUniversity'));
        Route::post('university/read', array('uses' => 'APIv1@readUniversity'));
        // other calls...

    });

但是,我注意到我可以对路线进行分组,将API版本和调用特定实体分开,例如useruniversity

Route::group(['namespace'=>'API', 'prefix' => 'api'], function() {

    Route::match(['get', 'put', 'delete'], '*', function () {
        return Response::json(array(
            'status' => 'Fail',
            'message' => 'Wrong HTTP verb used for the API call. Please use POST.'
            ));
    });
    /**
     * v.1
     */
    Route::group(['prefix' => 'v1', 'middleware' => 'api.v1'], function() {

        // User
        Route::group(['prefix' => 'user'], function() {
            Route::post('create', array('uses' => 'APIv1@createUser'));
            Route::post('read', array('uses' => 'APIv1@readUser'));
        });

        // University
        Route::group(['prefix' => 'university'], function() {
            Route::post('create', array('uses' => 'APIv1@createUniversity'));
            Route::post('read/synonym', array('uses' => 'APIv1@readUniversity'));
        });
    });
});

上方代码中的Route::match()不起作用。当我尝试访问任何API调用时,例如GET,匹配被忽略,我得到 MethodNotAllowedHttpException

我可以让第二个路径结构再次与Route::match()一起使用吗?我试图在组中的任何地方放置它。将Route::match()放在孔结构之外并将路径设置为'api / v1 / *'也会起作用。

1 个答案:

答案 0 :(得分:0)

如果您使用post()功能,则不需要拒绝其他动词。

您可以做的是为MethodNotAllowedHttpException创建一个监听器并显示您想要的内容。或者您也可以在路线组末尾使用any()功能来处理未定义的所有路线。