Используйте метод 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>