在我的route.php上我有
Route::resource('users', 'UserController');
Artisan route命令给了我
+--------+-----------------------------+---------------+------------------------+----------------+---------------+
| Domain | URI | Name | Action | Before Filters | After Filters |
+--------+-----------------------------+---------------+------------------------+----------------+---------------+
| | GET|HEAD / | | Closure | | |
| | GET|HEAD users | users.index | UserController@index | | |
| | GET|HEAD users/create | users.create | UserController@create | | |
| | POST users | users.store | UserController@store | | |
| | GET|HEAD users/{users} | users.show | UserController@show | | |
| | GET|HEAD users/{users}/edit | users.edit | UserController@edit | | |
| | PUT users/{users} | users.update | UserController@update | | |
| | PATCH users/{users} | | UserController@update | | |
| | DELETE users/{users} | users.destroy | UserController@destroy | | |
+--------+-----------------------------+---------------+------------------------+----------------+---------------+
然后我有一个页面用于编辑2个表单的用户,第一个用于编辑,第二个用于删除:
{{ Form::open(array('route' => array('users.update', $user->id), 'method' => 'put')) }}
...
{{ Form::open(array('route' => array('users.destroy', $user->id), 'method' => 'delete')) }}
最后进入UserController我使用了一个验证,在验证不成功的情况下重定向到上一页:
if (!$this->user->isValid($id))
{
return Redirect::back()->withInput()->withErrors($this->user->errors);
}
当我从用户列表页面登陆编辑页面时,两个表单的HTML看起来都很好(请注意隐藏的_method字段,其值为DELETE):
<form method="POST" action="http://www.virtualbox.me/users/8" accept-charset="UTF-8"><input name="_method" type="hidden" value="PUT">
...
<form method="POST" action="http://www.virtualbox.me/users/8" accept-charset="UTF-8"><input name="_method" type="hidden" value="DELETE">
但是如果我在一个导致验证失败的字段上插入一个值,那么在重新加载的页面上也是第二个表单get方法PUT而不是DELETE:
<form method="POST" action="http://www.virtualbox.me/users/8" accept-charset="UTF-8"><input name="_method" type="hidden" value="PUT">
...
<form method="POST" action="http://www.virtualbox.me/users/8" accept-charset="UTF-8"><input name="_method" type="hidden" value="PUT">
我做错了吗?
答案 0 :(得分:1)
这样的事情可能会有效......将此行更改为:
return Redirect::back()->withInput(Input::except('_method'))->withErrors($this->user->errors);
答案 1 :(得分:0)
实际上,Laravel会自动更改您在Docs.中作为注释提及的场景背后的方法。因为浏览器不了解PUT,PATCH,DELETE请求。
因此,您需要在DELETE表单中显式添加_method字段。
<field type="hidden" name="_method" value="DELETE">