У меня есть ссылка
<a class="trashButton" href="{{ URL::route('user.destroy',$members['id'][$i]) }}" style="cursor: pointer;"><i class="fa fa-trash-o"></i></a>
эта ссылка должна направить на метод destroy Usercontroller, это мой маршрут Route::resource('/user', 'BackEnd\UsersController');
UserController – это контроллер ресурсов. Но в данный момент он направляет меня к методу шоу, а не направляет на метод уничтожения
Это происходит потому, что вы запрашиваете ресурсы через метод GET вместо метода DELETE. Посмотрите:
DELETE /photo/{photo} destroy photo.destroy GET /photo/{photo} show photo.show
Оба маршрута имеют один и тот же URL-адрес, но заголовок-глагол идентифицирует, для вызова. Выглядит таблица RESTful . Например, через ajax вы можете отправить запрос DELETE:
$.ajax({ url: '/user/4', type: 'DELETE', // user.destroy success: function(result) { // Do something with the result } });
Вам нужно отправить запрос DELETE
вместо запроса GET
. Вы не можете сделать это со ссылкой, поэтому вам нужно использовать запрос AJAX или форму.
Вот способ формы:
<form action="{{ URL::route('user.destroy', $members['id'][$i]) }}" method="POST"> <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <button>Delete User</button> </form>
Если вы используете Laravel версии 5.1 или новее, вы можете использовать встроенные помощники Laravel для сокращения вашего кода:
<form action="{{ route('user.destroy', $members['id'][$i]) }}" method="POST"> {{ method_field('DELETE') }} {{ csrf_field() }} <button>Delete User</button> </form>
Подробнее о методу spoofing в Laravel вы можете прочитать здесь.
Я использую этот шаблон 'resources / views / utils / delete.blade.php'
<form action="{{ $url or Request::url() }}" method="POST"> {{ method_field('DELETE') }} {{ csrf_field() }} <button type='submit' class="{{ $class or 'btn btn-danger' }}" value="{{ $value or 'delete' }}">{!! $text or 'delete' !!}</button> </form>
Вызывается следующим образом:
@include('utils.delete',array( 'url' => URL::route('user.destroy',$id),'text' => '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> delete me'))
Если вы хотите сделать это через обычную ссылку, а не через AJAX или другой запрос формы, вы можете настроить специальный маршрут, который будет отвечать на обычный GET
:
В ваших маршрутах определите это в дополнение к ресурсу:
Route::get('user/{site}/delete', ['as' => 'user.delete', 'uses' => 'UserController@destroy']);
На ваш взгляд:
<a href="{{ route('user.delete', $user->id) }}">Delete this user</a>
В вашем контроллере:
public function destroy(User $user) { $user->delete(); return redirect()->route('users.index'); }
Если нам нужно использовать якорь для запуска маршрута уничтожения, и мы не хотим использовать ajax, мы можем поместить форму внутри нашей ссылки и отправить форму, используя атрибут onclick
:
<a href="javascript:void(0);" onclick="$(this).find('form').submit();" > <form action="{{ url('/resource/to/delete') }}" method="post"> <input type="hidden" name="_method" value="DELETE"> </form> </a>
.<a href="javascript:void(0);" onclick="$(this).find('form').submit();" > <form action="{{ url('/resource/to/delete') }}" method="post"> <input type="hidden" name="_method" value="DELETE"> </form> </a>
Если вы действительно хотите посетить действие destroy по удалению маршрута по HTML, существует подход к использованию HTTP Spoofing, что означает, что вы можете посетить метод удаления HTTP, добавив скрытую переменную с именем _method со значением «DELETE» . Такой же способ можно использовать для HTTP-метода «PUT» и «PATCH».
Ниже приведен пример метода DELETE.
<form action="/tasks/5" method="POST"> <input type="hidden" name="_method" value="DELETE"> </form>
получит маршрут
DELETE /tasks/{id} destroy tasks.destroy
если вы используете коллектив laravel, вы можете написать этот способ в своих представлениях.
{!! Form::open(['url' => '/tasks/'.$cat->id, 'method' => 'delete']) !!} {!! Form::submit('Delete', ['class' => 'btn btn-primary']) !!} {!! Form::close() !!}
удачи!
Если вы хотите использовать ссылку, вы можете использовать только что созданную библиотеку, которая позволяет людям создавать ссылки, которые ведут себя как POST, DELETE … calls.