【问题标题】:use DELETE method in route with Laravel 5.4在 Laravel 5.4 的路由中使用 DELETE 方法
【发布时间】:2017-10-22 04:14:10
【问题描述】:

我正在开发一个 Laravel (v 5.4) 项目,我使用 CRUD 来管理类别。目前,我可以创建一个新类别并且可以删除。

我创建了视图(带有刀片)来删除类别:

<table class="table">
  <thead>
    <th>Name</th>
    <th>Action</th>
  </thead>
  <tbody>
    @foreach ($categories as $category)
      <tr>
        <td>$category->name</td>
        <td>
          <a href="{{ url('/categories', ['id' => $category->id]) }}">
            <button class="btn btn-default">
            Delete
            </button>
          </a>
        </td>
      </tr>
    @endforeach
  </tbody>
</table>

在路由文件 web.php 中,我写道:

Route::delete('/categories/{id}', CategoryController@destroy);

我有一个控制器 CategoryController 和一个方法 destroy() 删除类别并重定向到类别列表。但是当我点击删除按钮时,我得到一个错误,说明这条路线没有定义。如果我用Route::get 替换Route::delete,它就可以工作。我认为 url 是用 GET 调用的,但我会保留它以进行其他操作。

我尝试将链接替换为表单和“DELETE”作为“方法”属性的值,但没有成功。

如何使用 DELETE 方法调用 url 以使用 Route::delete 捕获它?

提前致谢。

【问题讨论】:

    标签: php laravel blade


    【解决方案1】:

    如果你点击一个 url,它总是一个 GET 方法。

    既然你想把它定义为DELETE,你应该把它改成一个post form并添加

    <input type="hidden" name="_method" value="delete" />
    

    在里面。喜欢替换:

    <a href="{{ url('/categories', ['id' => $category->id]) }}">
        <button class="btn btn-default">Delete</button>
    </a>
    

    与:

    <form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
        <input class="btn btn-default" type="submit" value="Delete" />
        <input type="hidden" name="_method" value="delete" />
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
    </form>
    

    PUT 请求也是如此。

    Laravel 5.1 方法字段:

    <form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
        <input class="btn btn-default" type="submit" value="Delete" />
        {!! method_field('delete') !!}
        {!! csrf_field() !!}
    </form>
    

    Laravel 5.6 开始只有 @ 标签:

    <form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
        <input class="btn btn-default" type="submit" value="Delete" />
        @method('delete')
        @csrf
    </form>
    

    【讨论】:

      【解决方案2】:

      对于 laravel 5.7,请看我的例子:

      <form action="{{route('statuses.destroy',[$order_status->id_order_status])}}" method="POST">
       @method('DELETE')
       @csrf
       <button type="submit">Delete</button>               
      </form>
      

      【讨论】:

        【解决方案3】:

        GETPOST 以外的任何方法都需要您使用隐藏的表单输入来指定方法类型。这就是 laravel 检测它们的方式。在您的情况下,您需要使用表单发送删除操作。这样做。

        <table class="table">
            <thead>
            <th>Name</th>
            <th>Action</th>
            </thead>
            <tbody>
            @foreach ($categories as $category)
                <tr>
                    <td>$category->name</td>
                    <td>
                        <form action="/categories/{{ $category->id }}" method="post">
                            {{ method_field('delete') }}
                            <button class="btn btn-default" type="submit">Delete</button>
                        </form>
                    </td>
                </tr>
            @endforeach
            </tbody>
        </table>
        

        【讨论】:

          猜你喜欢
          • 2017-12-07
          • 1970-01-01
          • 1970-01-01
          • 2019-04-28
          • 2019-09-10
          • 1970-01-01
          • 2017-06-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多