资源控制器的 destroy 方法可以响应 GET 请求方法 While 不应该能够

destroy method of a resource controller can respond to GET request method While should not be able to

我有一个全局资源控制器并从中创建一条路由:

Route::resource('cat', 'CategoryController');

CategoryController class中是这样的destroy方法:

public function destroy (\App\Category $cat)
{
    $cat->delete();
    return ['success' => true, 'msg' => 'Category removed'];
}

现在根据 Docs about RESTful Resource Controllers destroy 应该可以响应通过 DELETE 方法发送的请求。但在这种情况下,它也可以响应通过 GET 方法发送的请求这让我感到奇怪。

它会发生什么?

我正在使用 laravel 5.3.4。

更新: 这是我的完整 CategoryController :

class CategoryController extends Controller
    {

        public function index ()
        {
            return view('admin/pages/post/category_manage');
        }

        public function create ()
        {

        }

        public function store (Request $request)
        {

            $result = ['success' => true, 'msg' => 'عملیات با موفقیت انجام شد'];

            $allData = $request->only('text', 'parent');

            $rules = array (
                'text'   => 'required|min:2',
                'parent' => 'required'
            );

            $validator = \Validator::make($allData, $rules);
            if ($validator->fails()) {

                $result = ['success' => false, 'msg' => $validator->errors()->first()];

            } else {

                if ($allData['parent'] == '#') {
                    $root = NULL;
                } else {
                    $root = Category::find($allData['parent']);
                }

                $newCategory = Category::create(['name' => $allData['text']]);
                if (is_null($root)) {
                    $newCategory->makeRoot();
                } else {
                    $newCategory->makeChildOf($root);
                }

                $result['generated_id'] = $newCategory->cat_id;

            }

            return $result;

        }

        public function show ($cat_alias)
        {

            return $cat_alias;
            $category = Category::whereCatAlias($cat_alias)->firstOrFail();

            $postCategory = Post::active()->scheduled()->whereHas('categories', function ($query) use ($cat_alias) {
                $query->whereCatAlias($cat_alias);
            })
                ->select(['post_title', 'post_sub_title', 'post_alias', 'start_date', 'end_date', 'created_at', 'hits', 'picture'])
                ->paginate(15);


//          return $postCategory;

            return view('main.pages.category', ['postsCategories' => $postCategory, 'category' => $category]);
        }

        public function edit ($id)
        {
            //
        }

        public function update ($id, Request $request)
        {
            $result = ['success' => true, 'msg' => 'عملیات با موفقیت انجام شد'];

            $allData = $request->only('text', 'old');
            $rules   = array (
                'text' => 'required|min:2',
                'old'  => 'required'
            );

            $validator = \Validator::make($allData, $rules);
            if ($validator->fails()) {
                $result = ['success' => false, 'msg' => $validator->errors()->first()];
            } else {
                $node        = Category::find($id);
                $newCategory = $node->update(['name' => $allData['text']]);
            }

            return $result;

        }

        public function destroy (\App\Category $cat)
        {
            $cat->delete();
            return ['success' => true, 'msg' => 'Category removed'];
        }
    }

以及完整路线:

Route::resource('cat', 'CategoryController');
Route::group(
            array (
                'prefix' => 'admin',
                'as'     => 'admin.',
                'middleware' => 'auth'
            ),
            function () {
                   Route::group(['prefix' => 'post'], function () {         
                       Route::resource('category', 'CategoryController');
                    });
             });
});

如您所见,在受保护的路由组中还有另一个资源控制器引用 CategoryController,名为 category

我认为 CategoryController 上的 2 条资源路由存在冲突。

你能试试这样实现吗?

Route::resource('cat', 'CategoryController', ['except' => 'destroy']);
Route::delete('cat', ['as' => 'cat.destroy', 'uses' => 'CategoryController@destroy']);

此外,按照您的方式实现路由非常混乱,请尝试尽可能明确地编写它们,以防止出现您遇到的奇怪错误。