我会用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))}}
答案 0 :(得分:33)
更新08/21/2017 for Laravel 5.x
问题是关于Laravel 4的问题,但是如果有人在寻找Laravel 5.x的答案,我会把它包括在内。表单助手(和其他一些人)aren't available as of 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请求。 Laravel中的CRUD根据REST工作。这意味着它期待DELETE请求而不是GET。
这是Boris Strahija tutorial的一种可能性。
{{ 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()方法。
答案 1 :(得分:17)
一个很酷的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;
}
答案 2 :(得分:15)
另一个&#34;清洁&#34;解决方案是使其成为here所述的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();');
});
在包含jQuery之后,不要忘记在模板中包含.js文件。
使用经典link_to()
或link_to_method()
函数创建删除记录的链接。请记住包含"data-method"="DELETE"
参数:
{{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
我喜欢这一点,它似乎比在刀片模板中使用Form::open();
膨胀您的代码更清晰。
答案 3 :(得分:8)
这是一个古老的问题,但我只是在寻找一个快速的答案,并且对这些问题都不满意。对于遇到同样问题的人,我建议创建一条新路线。过分担心crud合规性是愚蠢的,因为HTML上没有这样的东西;任何解决方案都只是鞋角,无论是隐藏的形式领域还是获取路线。
所以,在你的路线中,你可能有这样的东西:
Route::resource('users', 'UsersController');
这样做的问题是,获取“destroy”方法的唯一方法是发送一个post请求,其中有一个名为“_method”的隐藏输入和一个“DELETE”值。
只需在该行下添加:
Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'UsersController@destroy']);
现在,您可以通过HTML::linkRoute
,Route::url
或其他任何方法访问该路线。
例如:
{{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}
修改
我想澄清一下,虽然我已经解释了为什么向后弯曲以适应crud合规性有些愚蠢,但如果仅通过POST请求进行更改,您的应用程序仍然会更安全。
答案 4 :(得分:8)
对于那些希望在Laravel 5中创建删除按钮的人:
{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class'=>'btn btn-danger btn-mini']) !!}
{!! Form::close() !!}
这与Tayler的答案类似,但我们使用新的刀片转义标记({!!
和!!}
),我们使用Form
外观生成按钮,我们使用更优雅链接到控制器的方法。
在Laravel&lt; 5 Forms & HTML package被自动拉入。在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>
如果您使用的是其他表单构建器,请确保它生成类似于上面的内容。
答案 5 :(得分:4)
想要在表单外发送DELETE请求吗?
好吧,Jeffrey Way创建了一个很好的javascript,可以为您创建表单并使用它,您只需要将data-method="delete"
添加到删除链接。
要使用,请导入script,然后使用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();
})();
答案 6 :(得分:2)
对于那些希望在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() !!}
答案 7 :(得分:1)
我尝试了你的代码,像这样使用它并且工作:
<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]
答案 8 :(得分:0)
{{Form::open(['method'=>'delete','action'=>['ResourceController@destroy',$resource->id]])}}
<button type="submit">Delete</button>
{{Form::close()}}