Используйте метод DELETE по маршруту с Laravel 5.4

Я работаю над проектом 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}', [email protected]);

У меня есть контроллер CategoryController с методом уничтожения(), который удалить категорию и перенаправить к списку категорий. Но когда я нажимаю кнопку для удаления, я получаю сообщение об ошибке, объясняющее, что этот маршрут не определяется. Если я заменяю Route::delete на Route::get, он работает. Я думаю, что url вызывается с GET, но я бы сохранил это для другого действия.

Я пытался заменить ссылку с формой и "DELETE" в качестве значения атрибута "метод", но он не работает.

Как я могу вызвать url с методом DELETE, чтобы поймать его с помощью Route::delete?

Спасибо заранее.

Ответ 1

Если вы нажмете на URL, это всегда будет метод GET.

Поскольку вы хотите определить его как УДАЛИТЬ, вам следует переделать его в форму сообщения и добавить

<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 method_field:

<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

Любой метод, отличный от GET и POST, требует указания типа метода с помощью ввода скрытой формы. Это то, что обнаруживает их. В вашем случае вам нужно отправить действие удаления с помощью формы. Сделайте это.

<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>

Ответ 3

Для laravel 5.7 посмотрите мой пример:

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