подмена метода запроса в вспомогательном методе laravel action()?

В проекте Laravel 5.5 у меня есть студенческий контроллер с методом destory.

public function destroy(Student $student)
{
    //destroy $student and redirect
}

У меня есть маршрут для контроллера следующим образом

Route::delete('/student/{id}', 'StudentController@destroy');

Теперь давайте перейдем к вопросу.

У меня есть страница для управления студентами, и на ней есть кнопка удаления.

  <a class="btn btn-danger"
       href="{{ action('StudentController@destroy', ['id' => $student->id]) }}" >
  Delete
  </a>

когда я нажимаю кнопку удаления, он выдает method not allowed exception, поскольку запрос не является запросом на удаление. Есть ли способ/обходной путь, чтобы указать/подделать метод запроса с помощью action()/route() вспомогательных функций?

Обычно я бы создал форму со скрытым вводом _method="delete" и разместил форму. но если я добавлю кнопку обновления, мне придется создать другую форму со скрытым _method="patch" в ней, и я не думаю, что это хорошая практика.

пожалуйста, дайте несколько идей, чтобы двигаться вперед.


person Shobi    schedule 22.10.2017    source источник


Ответы (2)


Отвечая на ваш вопрос - да, вы должны создать форму, которая позволит вам удалить студента. Вот как следует использовать REST - вы не создаете обходные пути, а просто используете допустимый метод HTTP для данного действия.

Есть еще одна причина, по которой не следует использовать для этого ссылки и методы GET. Например, предположим, что ваш URL-адрес для удаления студента выглядит так:

http://example.com/students/1/delete

Когда вы вводите URL-адрес в браузере, браузеры обычно запоминают предыдущие URL-адреса, поэтому вы можете удалить некоторых студентов по ошибке, если вы использовали метод GET для удаления студентов.

Конечно, в приведенном выше примере вы можете использовать JavaScript, который будет запущен при нажатии на ссылку, которая запустит правильное действие HTTP, но это может потребовать больше работы, чем использование простой формы.

person Marcin Nabiałek    schedule 22.10.2017

Я могу думать об этом двумя способами:

  1. Создайте форму с помощью метода DELETE

    {!! Form::model($student, ['method' => 'DELETE', 'action' => ['StudentController@destroy', $student->id]]) !!}
        {!! Form::submit('Delete', ['class' => 'btn btn-danger']) !!}
    {!! Form::close() !!}
    
  2. Создайте запрос ajax с типом запроса DELETE

    $.ajax({
       url: '/students/'+id+'/delete,
       type: "DELETE",
       data:{ _token: "{{ csrf_token() }}" }
    });
    
person lewis4u    schedule 22.10.2017
comment
ajax способ в порядке. но это означает, что мы не можем подделывать HTTP-глаголы, используя методы action или route, верно? - person Shobi; 22.10.2017
comment
да. Всегда полезно сделать простую ссылку ‹a href=›. Только с помощью ajax и формы вы можете подделать метод - person lewis4u; 22.10.2017