【发布时间】: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');
});
});
});
正如你所见,在受保护的路由组中,有另一个资源控制器引用了名为 category 的 CategoryController。
【问题讨论】:
-
当您使用 GET 请求转到 api/cat/1 时,您会得到“已删除类别”?
-
@Bara'ayyash,没错。当然,我不使用 api,有一个网站,例如:
http://example.com/cat/1。 -
一定有什么错误。我已经多次使用资源。 destroy() 只能通过 DELETE 请求访问。你能显示更多的路由和控制器代码吗?你是如何提出这个要求的?使用表单提交或邮递员?
-
我认为标题有问题..尝试使用 POSTMAN 发出 GET 请求,看看会发生什么
-
@Bara'ayyash,我尝试了网络浏览器和 Postman,结果相同:删除类别。
标签: php laravel laravel-5.3