当前位置: 首页 > 知识库问答 >
问题:

LARAVEL-无法使用Route::资源生成破坏路由

赫连明诚
2023-03-14

上下文我在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')

这将解决问题。但是我不想创建一个额外的路线。我想使用通过使用资源()方法生成的路由。

共有1个答案

那开济
2023-03-14

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