CRUD Laravel 4 как связываться с уничтожением?

Я уничтожу своего пользователя с помощью HTML-ссылки, но похоже, что он не создает правильную ссылку, что я делаю неправильно?

public function destroy($id) { //Slet brugeren $e = new User($id); $e->destroy(); //Log også brugeren ud Auth::logout(); //redrect til forsiden Redirect::to("users/create"); } 

На мой взгляд, я называю это {{URL::action('UserController@destroy', array($user->id))}}

Solutions Collecting From Web of "CRUD Laravel 4 как связываться с уничтожением?"

Обновление 21.08.2017 для Laravel 5.x

Вопрос спрашивает о Laravel 4, но я включаю это в случае, если люди, ищущие ответы Laravel 5.x, оказываются здесь. Форма и другие помощники недоступны с 5.x. Вам все равно нужно указать метод в форме, если вы делаете что-то помимо GET или POST. Это текущий способ выполнить это:

 <form action="/foo/bar" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <!-- other inputs... --> </form> 

Вы также можете использовать {{ method_field('PUT') }} вместо записи скрытого ввода _method .

См. https://laravel.com/docs/5.4/routing#form-method-spoofing

Оригинальный ответ для Laravel 4

Я думаю, когда вы нажмете ссылку, возможно, она отправит GET-запрос в эту конечную точку. CRUD в Laravel работает в соответствии с REST. Это означает, что он ожидает запроса DELETE вместо GET.

Вот одна возможность из учебника Бориса Страхии.

  {{ Form::open(array('route' => array('admin.pages.destroy', $page->id), 'method' => 'delete')) }} <button type="submit" class="btn btn-danger btn-mini">Delete</button> {{ Form::close() }} 

Таким образом, вы отправляете запрос в форме с помощью метода DELETE. В статье объясняется, почему традиционная ссылка не будет работать:

Вы можете заметить, что кнопка удаления находится внутри формы. Причина этого в том, что метод destroy () от нашего контроллера нуждается в запросе DELETE, и это можно сделать таким образом. Если кнопка была простой ссылкой, запрос будет отправлен с помощью метода GET, и мы не будем называть метод destroy ().

Охлаждающее решение ajax, которое работает, таково:

 function deleteUser(id) { if (confirm('Delete this user?')) { $.ajax({ type: "DELETE", url: 'users/' + id, //resource success: function(affectedRows) { //if something was deleted, we redirect the user to the users page, and automatically the user that he deleted will disappear if (affectedRows > 0) window.location = 'users'; } }); } } <a href="javascript:deleteUser('{{ $user->id }}');">Delete</a> 

И в UserController.php у нас есть этот метод:

 public function destroy($id) { $affectedRows = User::where('id', '=', $id)->delete(); return $affectedRows; } 

Еще одно «чистое» решение – сделать его способом Rails, как описано здесь :

  1. Создайте новый .js-файл публично и напишите эту функцию:

     $(function(){ $('[data-method]').append(function(){ return "\n"+ "<form action='"+$(this).attr('href')+"' method='POST' style='display:none'>\n"+ " <input type='hidden' name='_method' value='"+$(this).attr('data-method')+"'>\n"+ "</form>\n" }) .removeAttr('href') .attr('style','cursor:pointer;') .attr('onclick','$(this).find("form").submit();'); }); 
  2. Не забудьте включить файл .js в свой шаблон после включения jQuery.

  3. Используйте функции link_to() или link_to_method() для создания ссылок для удаления записей. Не забудьте включить параметр "data-method"="DELETE" :

     {{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }} 

Что мне нравится в этом, что кажется намного чище, чем раздувание вашего кода с помощью Form::open(); в шаблонах клинков.

Для тех, кто хочет создать кнопку удаления в Laravel 5:

 {!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'delete']) !!} {!! Form::submit('Delete', ['class'=>'btn btn-danger btn-mini']) !!} {!! Form::close() !!} 

Это похоже на ответ Тейлера, но мы используем новые метки сбегателей ( {!! и !!} ), мы используем фасад Form для генерации кнопки, и мы используем более элегантный подход к ссылке на контроллер.

В Laravel <5 пакет Forms & HTML был вытащен автоматически. В Laravel 5 мы должны добавить этот пакет к composer.json :

 ... "required": { ... "laravelcollective/html": "^5.1" } ... 

Теперь добавьте Service Provider и Alias ​​в config/app.php :

 ... 'providers' => [ ... Collective\Html\HtmlServiceProvider::class, ], 'aliases' => [ ... 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class, ], 

Вышеприведенный результат

 <form method="POST" action="https://yourdomain.tld/users/1" accept-charset="UTF-8"> <input name="_method" type="hidden" value="DELETE"> <input name="_token" type="hidden" value="xxxCrAZyT0K3nsTr!NGxxx"> <input class="btn btn-danger btn-mini" type="submit" value="Delete"> </form> 

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

Это старые вопросы, но я просто искал быстрый ответ и не удовлетворен ни одним из них. То, что я предлагаю кому-либо с этой же проблемой, – создать новый маршрут. Беспокойство слишком много о соблюдении кроны – это глупо, потому что в HTML нет такой вещи; любое решение является просто обувным рогатым, чтобы соответствовать, будь то скрытое поле формы или маршрут получения.

Итак, на ваших маршрутах, вероятно, есть что-то вроде этого:

Route::resource('users', 'UsersController'); Проблема в том, что единственный способ добраться до метода «уничтожить» – это отправить почтовый запрос с скрытым вводом с именем «_method» и значением «DELETE».

Просто добавьте в эту строку: Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'UsersController@destroy']);

Теперь у вас есть маршрут, к HTML::linkRoute вы можете получить доступ: HTML::linkRoute , Route::url или любой другой метод.

Например: {{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}

РЕДАКТИРОВАТЬ

Я хочу пояснить, хотя я объяснил, почему несколько глупо наклоняться назад, чтобы соответствовать требованиям соответствия, но все же верно, что ваше приложение будет более безопасным, если изменения будут сделаны только через запросы POST.

Хотите отправить запрос DELETE вне формы?

Ну, Jeffrey Way создал красивый javascript, который создает форму для вас и для ее использования вам нужно только добавить data-method="delete" к вашим ссылкам на удаление.

Чтобы использовать, импортируйте скрипт и создайте ссылку с атрибутом data-method="DELETE" .

скрипт:

 (function() { var laravel = { initialize: function() { this.methodLinks = $('a[data-method]'); this.registerEvents(); }, registerEvents: function() { this.methodLinks.on('click', this.handleMethod); }, handleMethod: function(e) { var link = $(this); var httpMethod = link.data('method').toUpperCase(); var form; // If the data-method attribute is not PUT or DELETE, // then we don't know what to do. Just ignore. if ( $.inArray(httpMethod, ['PUT', 'DELETE']) === - 1 ) { return; } // Allow user to optionally provide data-confirm="Are you sure?" if ( link.data('confirm') ) { if ( ! laravel.verifyConfirm(link) ) { return false; } } form = laravel.createForm(link); form.submit(); e.preventDefault(); }, verifyConfirm: function(link) { return confirm(link.data('confirm')); }, createForm: function(link) { var form = $('<form>', { 'method': 'POST', 'action': link.attr('href') }); var token = $('<input>', { 'type': 'hidden', 'name': 'csrf_token', 'value': '<?php echo csrf_token(); ?>' // hmmmm... }); var hiddenInput = $('<input>', { 'name': '_method', 'type': 'hidden', 'value': link.data('method') }); return form.append(token, hiddenInput) .appendTo('body'); } }; laravel.initialize(); })(); 

Для тех, кто хочет создать кнопку удаления с использованием тега anchor в laravel 5.

 {!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'DELETE', 'name' => 'post_' . md5($user->id . $user->created_at)]) !!} <a href="javascript:void(0)" title="delete" onclick="if (confirm('Are you sure?')) { document.post_<?= md5($user->id . $user->created_at) ?>.submit(); } event.returnValue = false; return false;"> <span class="icon-remove"></span> </a> {!! Form::close() !!} 

Я пробовал ваш код, использовал его так и работал:

  <a href="{{URL::action('UserController@destroy',['id'=>$user->id]) }}" onclick=" return confirm('Are you sure you want to delete this?')" class="btn btn-default"> DELETE </a> 

Я думаю, что единственная проблема в вашем массиве:

 ['id'=>$user->id] 
 {{Form::open(['method'=>'delete','action'=>['ResourceController@destroy',$resource->id]])}} <button type="submit">Delete</button> {{Form::close()}}