简体   繁体   English

API请求中的Laravel可选参数未正确识别

[英]Laravel optional parameter in API-request perceived incorrectly

In my api.php I've these routes. 在我的api.php中,我有这些路线。

I can request endpoint: /api/v2/commodities/1 - this request is being redirected to APICommodityController@read - this is OK! 我可以请求端点: /api/v2/commodities/1该请求被重定向到APICommodityController@read可以!

The problem occur whenever I GET-request /v2/commodities/categories/ . 每当我GET-request /v2/commodities/categories/时,就会发生此问题。 I'd like this request to be redirected into the route-group: 'categories', but instead Laravel perceive this as a optional parameter within the first group (~ ref. "HERE" in code-comment). 我希望将此请求重定向到route-group:'categories',但是Laravel认为这是第一组中的可选参数(在代码注释中为〜ref。“ HERE”)。

How do I fix this? 我该如何解决?

Route::group( [ 'prefix' => 'v2' ], function() {

    /**
     * Commodity
     */
    Route::group( [ 'prefix' => 'commodities' ], function() {

        /**
         * C: CREATE
         */
        Route::post( '{id?}', 'API\v2\Commodity\APICommodityController@updateOrCreate' );

        /**
         * U: UPDATE
         */
        Route::put( '{id}', 'API\v2\Commodity\APICommodityController@updateOrCreate' );

        /**
         * R: READ (HERE)
         */
        Route::get( '{id?}', 'API\v2\Commodity\APICommodityController@read' );

        /**
         * D: DELETE
         */
        Route::delete( '{id}', 'API\v2\Commodity\APICommodityController@delete' );

        /**
         * Commodity categories
         */
        Route::group( [ 'prefix' => 'categories' ], function() {

            /**
             * C: CREATE
             */
            Route::post( '{id?}', 'API\v2\CommodityCategories\APICommodityCategoriesController@updateOrCreate' );

            /**
             * U: UPDATE
             */
            Route::put( '{id}', 'API\v2\CommodityCategories\APICommodityCategoriesController@updateOrCreate' );

            /**
             * R: READ
             */
            Route::get( '{id?}', 'API\v2\CommodityCategories\APICommodityCategoriesController@read' );

            /**
             * D: DELETE
             */
            Route::delete( '{id}', 'API\v2\CommodityCategories\APICommodityCategoriesController@delete' );

        } );

    } );

add this condition at the end of your id parameters : 在您的id参数末尾添加此条件:

->where('id', '[0-9]+')

so it becomes something like this : 所以变成这样的东西:

Route::get( '{id?}', 'API\v2\Commodity\APICommodityController@read' )->where('id', '[0-9]+');

Simply move your Commodity categories route section above all other route definition. 只需将商品类别的路线部分移至所有其他路线定义之上。 This will make laravel register this static route and not be caught by dynamic routing. 这将使laravel注册此静态路由,而不会被动态路由捕获。

Something like that: 像这样:

Route::group( [ 'prefix' => 'v2' ], function() {

    /**
     * Commodity
     */
    Route::group( [ 'prefix' => 'commodities' ], function() {
        /**
         * Commodity categories
         */
        Route::group( [ 'prefix' => 'categories' ], function() {

            /**
             * C: CREATE
             */
            Route::post( '{id?}', 'API\v2\CommodityCategories\APICommodityCategoriesController@updateOrCreate' );

            /**
             * U: UPDATE
             */
            Route::put( '{id}', 'API\v2\CommodityCategories\APICommodityCategoriesController@updateOrCreate' );

            /**
             * R: READ
             */
            Route::get( '{id?}', 'API\v2\CommodityCategories\APICommodityCategoriesController@read' );

            /**
             * D: DELETE
             */
            Route::delete( '{id}', 'API\v2\CommodityCategories\APICommodityCategoriesController@delete' );

        } );

        /**
         * C: CREATE
         */
        Route::post( '{id?}', 'API\v2\Commodity\APICommodityController@updateOrCreate' );

        /**
         * U: UPDATE
         */
        Route::put( '{id}', 'API\v2\Commodity\APICommodityController@updateOrCreate' );

        /**
         * R: READ (HERE)
         */
        Route::get( '{id?}', 'API\v2\Commodity\APICommodityController@read' );

        /**
         * D: DELETE
         */
        Route::delete( '{id}', 'API\v2\Commodity\APICommodityController@delete' );
    } );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM