Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.07.2020 00:03:18

Не срабатывает destroy

Ребят, привет. Помогите плиз новичку разобраться, почему не удаляются записи?
В общем код в контролере:

public function destroy($id){
      Companies::find($id)->delete();
      return redirect()->route('companies.index')->with('success', 'Компания удалена');
}

В web.php роут, записи не удаляются (просто происходит переход на страницу просмотра записи):

Route::resource("/companies", "CompaniesController");

Но если роут на удаление прописать отдельно так, то все удаление происходит:

Route::get('/companies/{id}/delete', 'CompaniesController@destroy')->name('companies.destroy');

В чем прикол? Хотел по-людски, чтобы меньше кода было, но не тут то было... Что я не учел?

---
Остальные функции работают
laravel 5.8.38
php 7.4.2

Изменено Andry100500 (14.07.2020 00:10:58)

Не в сети

#2 14.07.2020 14:40:15

Re: Не срабатывает destroy

Скорее всего в форме не прописан метод. Для удаление нужно `@method('delete')`

Не в сети

#3 14.07.2020 18:00:05

Re: Не срабатывает destroy

100% не приписан,  у меня вообще там формы нет, так сделано:

<a class="btn btn-lg btn-danger" href="{{ route('companies.destroy', $element->id) }}" role="button">Удалить</a>

А есть пример, как правильно делать? Или может где-то обсуждалось?

Не в сети

#4 14.07.2020 18:24:37

Re: Не срабатывает destroy

Посмотрите здесь

https://laravel.su/docs/6.x/blade#method-field

Не в сети

#5 14.07.2020 18:27:54

Re: Не срабатывает destroy

Andry100500, первое что нужно, это иметь в виду методы HTTP. Есть GET, POST, PUT и DELETE (могут быть и другие). Когда ты просто переходишь по ссылке, набрав адрес в строке браузера или перейдя по ссылке <a href>, это GET. А Route::resource() связывает Controller::destroy() с методом DELETE. Никак не c GET.

Есть правило хорошего тона: никогда не изменять данные в обработчике метода GET. И ресурсный контроллер его придерживается. Короче говоря, если ты хочешь чтоы срабатывал destroy(), сделай так чтобы Javascript вызвал метод DELETE.

Так как браузеры традиционно использовали только GET и POST, придумали такой трюк: использовать для всех недостающих http-методов специальную переменную с именем _method.
Можно сделать форму с method=POST, а в ней "псевдо-" поле <input type="hidden" name="_method" value="DELETE">, именно для этого служит конструкция @method()


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#6 14.07.2020 19:26:50

Re: Не срабатывает destroy

Ребят, прям шикарно помогли. Спасибо огромное!

Не в сети

Подвал раздела