【问题标题】:destroy method of a resource controller can respond to GET request method While should not be able to资源控制器的destroy方法可以响应GET请求方法虽然应该不能
【发布时间】:2017-04-20 20:47:37
【问题描述】:

我有一个全局资源控制器,并以此为基础创建一个路由:

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

CategoryController 类中的 destroy 方法如下:

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

现在根据Docs about RESTful Resource Controllersdestroy应该可以响应通过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');
                    });
             });
});

正如你所见,在受保护的路由组中,有另一个资源控制器引用了名为 categoryCategoryController

【问题讨论】:

  • 当您使用 GET 请求转到 api/cat/1 时,您会得到“已删除类别”?
  • @Bara'ayyash,没错。当然,我不使用 api,有一个网站,例如:http://example.com/cat/1
  • 一定有什么错误。我已经多次使用资源。 destroy() 只能通过 DELETE 请求访问。你能显示更多的路由和控制器代码吗?你是如何提出这个要求的?使用表单提交或邮递员?
  • 我认为标题有问题..尝试使用 POSTMAN 发出 GET 请求,看看会发生什么
  • @Bara'ayyash,我尝试了网络浏览器和 Postman,结果相同:删除类别。

标签: php laravel laravel-5.3


【解决方案1】:

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

您可以尝试以这种方式实现它们吗?

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

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

【讨论】:

猜你喜欢
  • 2020-12-09
  • 2017-05-24
  • 2012-09-27
  • 2014-01-28
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 2017-10-17
相关资源
最近更新 更多