Подтвердить что ты не робот

CRUD Laravel 5 как связать с уничтожением контроллера ресурсов?

У меня есть ссылка

<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 - это контроллер ресурсов. Но в данный момент он направляет меня к методу show, а не направляет на метод destroy

4b9b3361

Ответ 1

Это потому, что вы запрашиваете ресурсы через метод 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
    }
});

Ответ 2

Вам нужно отправить запрос 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 здесь.

Ответ 3

Я использую этот шаблон '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'))

Ответ 4

Если вы хотите сделать это с помощью обычной ссылки, а не через AJAX или другой запрос формы, вы можете настроить специальный маршрут, который будет отвечать на обычный запрос GET:

В ваших маршрутах определите это в дополнение к ресурсу:

Route::get('user/{site}/delete', ['as' => 'user.delete', 'uses' => '[email protected]']);

На ваш взгляд:

<a href="{{ route('user.delete', $user->id) }}">Delete this user</a>

В вашем контроллере:

public function destroy(User $user)
{
  $user->delete();
  return redirect()->route('users.index');
}

Ответ 5

Если нам нужно использовать якорь для запуска маршрута уничтожения, и мы не хотим использовать 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>

Ответ 6

Если вы действительно хотите посетить действие 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() !!}

Ответ 7

Если вы хотите использовать ссылку, вы можете использовать созданную мной библиотеку, которая позволяет людям создавать ссылки, которые ведут себя как POST, DELETE... calls.

https://github.com/Patroklo/improved-links