hel*_*rld 25 php laravel 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");
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我称之为
{{URL::action('UserController@destroy', array($user->id))}}
Tay*_*ler 33
为Laravel 5.x更新时间:08/21
关于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>
Run Code Online (Sandbox Code Playgroud)
您也可以使用{{ method_field('PUT') }}
而不是写出隐藏的_method
输入.
请参阅https://laravel.com/docs/5.4/routing#form-method-spoofing
Laravel 4的原始答案
我想当你点击链接时,它可能会向该终点发送一个GET请求.Laravel中的CRUD根据REST工作.这意味着它期待DELETE请求而不是GET.
这是Boris Strahija 教程的一种可能性.
{{ 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() }}
Run Code Online (Sandbox Code Playgroud)
这样,您可以使用DELETE方法以表单形式发送请求.这篇文章解释了为什么传统链接不起作用:
您可能会注意到删除按钮位于表单内.原因是我们的控制器的destroy()方法需要DELETE请求,这可以通过这种方式完成.如果按钮是一个简单的链接,请求将通过GET方法发送,我们不会调用destroy()方法.
pau*_*dru 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>
Run Code Online (Sandbox Code Playgroud)
在UserController.php中我们有这个方法:
public function destroy($id)
{
$affectedRows = User::where('id', '=', $id)->delete();
return $affectedRows;
}
Run Code Online (Sandbox Code Playgroud)
小智 15
另一种"干净"的解决办法是让Rails的方式描述在这里:
在public中创建一个新的.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();');
});
Run Code Online (Sandbox Code Playgroud)在包含jQuery之后,不要忘记在模板中包含.js文件.
使用经典link_to()
或link_to_method()
函数创建删除记录的链接.只记得包含"data-method"="DELETE"
参数:
{{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
Run Code Online (Sandbox Code Playgroud)我喜欢这个,它似乎比Form::open();
在刀片模板中膨胀你的代码更清晰.
这是一个古老的问题,但我只是在寻找一个快速的答案,并且对这些问题都不满意.对于遇到同样问题的人,我建议创建一条新路线.过分担心crud合规性是愚蠢的,因为HTML上没有这样的东西; 任何解决方案只是鞋角适合,无论是隐藏的形式领域还是获取路线.
所以,在你的路线中,你可能会有这样的事情:
Route::resource('users', 'UsersController');
这里的问题是,只有这样,才能到"消灭"的方法是发送具有名为"_method"的隐藏输入的"删除"一个价值POST请求.
只需在该行下添加:
Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'UsersController@destroy']);
现在你有,你可以从访问路线HTML::linkRoute
,Route::url
或任何你请.
例如:
{{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}
编辑
我想澄清一下,虽然我已经解释了为什么它有点傻弯腰向后,以适应污物达标,它仍然是真实的,你的应用将更加安全,如果改变是通过POST请求只发.
对于那些希望在Laravel 5中创建删除按钮的人:
{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class'=>'btn btn-danger btn-mini']) !!}
{!! Form::close() !!}
Run Code Online (Sandbox Code Playgroud)
这与Tayler的答案类似,但我们使用新的刀片转义标签({!!
和!!}
),我们使用Form
立面生成按钮,我们使用更优雅的方法链接到控制器.
在Laravel <5中,Forms和HTML包被自动拉入.在Laravel 5中,我们必须将此包添加到composer.json
:
...
"required": {
...
"laravelcollective/html": "^5.1"
}
...
Run Code Online (Sandbox Code Playgroud)
现在添加服务提供者和别名config/app.php
:
...
'providers' => [
...
Collective\Html\HtmlServiceProvider::class,
],
'aliases' => [
...
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
],
Run Code Online (Sandbox Code Playgroud)
以上将输出
<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>
Run Code Online (Sandbox Code Playgroud)
如果您使用的是其他表单构建器,请确保它生成类似于上面的内容.
归档时间: |
|
查看次数: |
38432 次 |
最近记录: |