上下文我在Laravel8中工作,我使用DataTables插件来显示数据库中的记录。正如您将在代码中看到的,我使用Route::resource('animal','AnimalController')创建了所有要执行CRUD的路由。这将为销毁方法生成如下路径:animal/{id}
问题。当我按下特定记录的删除按钮时,记录会被删除,没关系,但是浏览器控制台会返回这个错误:“此路由不支持DELETE方法。支持的方法: GET、HEAD、POST",因此Javascript被破坏,记录被删除的警报永远不会显示。如果我将请求类型更改为POST而不是DELETE,则错误告诉我不支持POST,而DELETE是!
问题:我做错了什么?
路线
Route::resource('animal', 'AnimalController');
控制器来打印数据表
public function index(Request $request)
{
if($request->ajax()) {
$animals = DB::select('CALL sp_select_animal()');
return DataTables::of($animals)
->addIndexColumn()
->addColumn('action', function($animals){
$actions = '<a href="" class="btn btn-info btn-sm">Edit</a>';
$actions .= '<button type="button" id="'.$animals->id.'" data-name="'.$animals->name.'" name="delete" class="btn btn-danger btn-sm ml-1 delete">Delete</button>';
return $actions;
})
->rawColumns(['action'])
->make(true);
}
return view('animal.index');
}
删除记录的控制器
public function destroy($id)
{
$animal = DB::select('CALL sp_destroy_animal(?)', [$id]);
return back();
}
看法
jQuery('#BTNdelete').click(function(e){
e.preventDefault();
var url = '{{ route("animal.destroy", ":xxx") }}';
url = url.replace(':xxx', animalID);
jQuery.ajax({
"url": url,
"type": 'DELETE',
"data": {
"_token": "{{ csrf_token() }}"
},
success: function(data) {
setTimeout(function() {
jQuery('#modal').modal('hide');
toastr.warning('The record was successfully deleted', 'Delete Record', {timeOut:3000});
jQuery('#tableAnimal').DataTable().ajax.reload();
}, 100);
}
});
});
现在一切正常,如果我创建一个特定的路由来删除记录,例如
Route::get('animal/delete/{id}', [AnimalController::class, 'destroy'])->name('animal.destroy')
这将解决问题。但是我不想创建一个额外的路线。我想使用通过使用资源()
方法生成的路由。
JavaScript中存在很多问题,但问题的根源在于浏览器无法发出删除请求,因此必须伪造这些请求。
// bind to the class of the button, not a non-existent ID
jQuery('button.delete').click(function(e) {
// this isn't really needed, a button has no default action
e.preventDefault();
// you do want to stop the event from bubbling though
e.stopPropagation();
// this properly escapes the value for JavaScript, not HTML
var url = @json(route("animal.destroy", ":xxx"));
// WHAT IS animalID ???
url = url.replace(':xxx', animalID);
// build the post request with the fake method added
jQuery.post(
url,
{_token: @json(csrf_token()), _method: "DELETE"},
function(data) {
setTimeout(function() {
jQuery('#modal').modal('hide');
toastr.warning('The record was successfully deleted', 'Delete Record', {timeOut:3000});
jQuery('#tableAnimal').DataTable().ajax.reload();
}, 100);
}
);
});
但必须指出的是,控制器的index()
方法不应该处理HTML;这完全是视图的工作。只提供构建HTML所需的数据。这可以使用列来完成。渲染
。请参见此问题以获取示例。
我阅读了Laravel网站、Stack Overflow和Google上的文档,但仍然不理解Route::资源和Route::controller之间的区别。 其中一个答案是Route::resource用于crud。但是,使用Route::controller,我们可以完成与Route::resource相同的任务,并且我们只能指定所需的操作。 他们看起来像兄弟姐妹: 我们如何选择使用什么?什么
作为一个 web 后台框架,路由无疑是极其重要的一部分。本博客接下来几篇文章都将会围绕路由这一主题来展开讨论,分别讲述: 路由的使用 路由属性注册 路由的正则编译与匹配 路由的中间件 路由的控制器与参数绑定 RESTful 路由 和之前一样,第一篇将会利用单元测试样例说明我们在平时可能用到的 route 的 api 函数用法,后面几篇文章将会剖析 laravel 的 route 源码。下面开始介绍
作为 laravel 极其重要的一部分,route 功能贯穿着整个网络请求,是 request 生命周期的主干。本文主要讲述 route 服务的注册与启动、路由的属性注册。本篇内容相对简单,更多的是框架添加路由的整体设计流程。 route 服务的注册 laravel 在接受到请求后,先进行了服务容器与 http 核心的初始化,再进行了请求 request 的构造与分发。 route 服务的注册——
我们在前面的文章已经讲了整个路由与控制器的源码,我们今天这个文章开始向大家介绍在 laravel 中创建 RESTFul 风格的控制器。 关于什么是RESTFul风格及其规范可参考这篇文章:理解RESTful架构。 关于 laravel 中 RESTFul 风格控制器的创建简要介绍 : HTTP控制器实例教程 —— 创建 RESTFul 风格控制器实现文章增删改查 创建 RESTFul 风格控制器
laravel 为我们提供便携的重定向功能,可以由门面 Redirect,或者全局函数 redirect() 来启用,本篇文章将会介绍重定向功能的具体细节及源码分析。 URI 重定向 重定向功能是由类 UrlGenerator 所实现,这个类需要 request 来进行初始化: $url = new UrlGenerator( $routes = new RouteCollection,
我正在使用JWt all方法(索引、存储、显示等)在laravel中创建待办事项应用程序,路由资源中的所有方法(索引、存储、显示等)工作正常,除了结果更新外,其工作正常,并获得成功响应,但数据库中没有更改 **对不起,我的英语不好 应用程序编程接口。php BaseController。php TodoController。php 这是《邮差》的结果 https://i.stack.imgur.c