如果页面由Redirect :: back调用,则Form :: open将获取错误的路由

时间:2014-09-12 14:39:22

标签: laravel blade laravel-routing

在我的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">

我做错了吗?

2 个答案:

答案 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">