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('[email protected]', array($user->id))}}
Ответы
Ответ 1
Обновление 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().
Ответ 2
Охлаждающее решение 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;
}
Ответ 3
Еще одно "чистое" решение - сделать это способом Rails, как описано здесь:
-
Создайте новый .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();');
});
-
Не забудьте включить файл .js в свой шаблон после включения jQuery.
-
Используйте классические функции link_to()
или link_to_method()
для создания ссылок для удаления записей. Не забудьте включить параметр "data-method"="DELETE"
:
{{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
Что мне нравится в этом, кажется, что он намного чище, чем раздувание вашего кода с помощью Form::open();
в шаблонах клинков.
Ответ 4
Это старые вопросы, но я просто искал быстрый ответ и не удовлетворен ни одним из них. То, что я предлагаю кому-либо с этой же проблемой, - создать новый маршрут. Беспокойство слишком много о соблюдении кроны - это глупо, потому что в HTML нет такой вещи; любое решение просто подходит для обуви, будь то скрытое поле формы или маршрут получения.
Итак, на ваших маршрутах, вероятно, есть что-то вроде этого:
Route::resource('users', 'UsersController');
Проблема в том, что единственный способ добраться до метода "уничтожить" - это отправить почтовый запрос с скрытым вводом с именем "_method" и значением "DELETE".
Просто добавьте в эту строку:
Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'[email protected]']);
Теперь у вас есть маршрут, к которому вы можете получить доступ: HTML::linkRoute
, Route::url
или любой другой метод.
Например:
{{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}
ИЗМЕНИТЬ
Я хочу пояснить, хотя я объяснил, почему это глупо перегибаться назад, чтобы соответствовать непротиворечивости, все равно верно, что ваше приложение будет более безопасным, если изменения будут сделаны только через запросы POST.
Ответ 5
Для тех, кто хочет создать кнопку удаления в Laravel 5:
{!! Form::open(['action' => ['[email protected]', $user->id], 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class'=>'btn btn-danger btn-mini']) !!}
{!! Form::close() !!}
Это похоже на ответ Тейлера, но мы используем новые метки отладки ({!!
и !!}
), мы используем фасад Form
для генерации кнопки, и мы используем более элегантный подход к ссылке на контроллер,
В Laravel < 5 Формы и HTML-пакет были автоматически втянуты. В Laravel 5 мы должны добавить этот пакет к composer.json
:
...
"required": {
...
"laravelcollective/html": "^5.1"
}
...
Теперь добавьте поставщика услуг и псевдоним в 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>
Если вы используете другой конструктор форм, убедитесь, что он генерирует нечто похожее на приведенное выше.
Ответ 6
Хотите отправить запрос DELETE вне формы?
Ну, Jeffrey Way создал хороший javascript, который создает форму для вас и для ее использования вам нужно добавить data-method="delete"
в свой удалить ссылки.
Чтобы использовать, импортируйте script и создайте ссылку с атрибутом data-method="delete"
.
script:
(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();
})();
Ответ 7
Для тех, кто хочет создать кнопку удаления с использованием тега привязки в laravel 5.
{!! Form::open(['action' => ['[email protected]', $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() !!}
Ответ 8
Я попробовал ваш код, использовал его так:
<a href="{{URL::action('[email protected]',['id'=>$user->id]) }}"
onclick=" return confirm('Are you sure you want to delete this?')"
class="btn btn-default">
DELETE </a>
Я думаю, что единственная проблема в вашем массиве:
['id'=>$user->id]
Ответ 9
{{Form::open(['method'=>'delete','action'=>['[email protected]',$resource->id]])}}
<button type="submit">Delete</button>
{{Form::close()}}