首先,它不是我向错误的路由动词发送请求的入门级错误。
我的情况就是这样:我有一条路线
synchronized
当我点击此路线时,我有一个随机表单来更新特定的用户详细信息。事情就是当我提交表格时,它会去路线:
Route::post('/user/edit', 'UserController@edit');
一切正常。但我想添加一小部分验证,因此用户不会向我发送相同的现有数据,因此我添加了验证:
Route::put('user/update','UserController@update');
事情就是当验证踢它重新定向回来时我可以手动捕获会话的消息,我看到验证工作正常,它应该发送回第一个路由但我得到一个方法不允许异常。我假设验证基方法发回GET请求?
任何想法如何解决这个问题>
答案 0 :(得分:1)
是的,这就是验证的工作原理。当数据无效时,使用明显的GET方法进行重定向。
通常,您不应在POST操作中显示表单。通常你应该做的是重定向到通过GET可用的其他路线。这通常也适用于多步形式:
GET step1 - > POST步骤1 - > GET步骤2 - > POST第2步,依此类推。
所以你应该在你的情况下完全相同,以使其与验证一起工作。
答案 1 :(得分:0)
要显示表单,请使用GET方法而不是POST方法。所以你的路线应该是这样的:
Route::get('/user/edit', 'UserController@edit');
然后在操作按钮中更新用户的信息:
Route::put('/user/update', 'UserControler@update');
只是提示:您的update route
可以是对/user
路线的PUT呼叫。
我的第一个问题是您想要更新已登录的用户个人资料,但在您发表评论之后,我认为这是针对其他人的。
在我看来,您应该将user_id
作为route parameter添加到路线中并通过 GET 调用发送,而不是将user_id
作为正文发送到 POST 电话。
因此,您的 GET 路线应如下所示:
Route::get('users/{user}/edit', 'UserController@edit');
并更新他/她:
Route::put('/users/{user}/update', 'UserControler@update');
请注意,{user}
元素是您应添加user_id
的位置,因此在您的控制器中,您可以执行以下操作:
public function edit(User $user)
{
return view('user.edit')->withUser($user);
}
public function update(User $user, Request $request)
{
// some validation logic here
// to get all the request data
$data = $request->all();
// updating user
$user->fill($data);
// saving data
$user->save();
// return the view that you want.
return view('user.show')->withUser($user);
}
请注意,我没有使用$user = User::find($id);
在方法中找到正确的对象,因为:
Laravel自动解析路径或控制器操作中定义的Eloquent模型,其类型提示的变量名称与路径段名称匹配。
check the docs了解更多信息。
答案 2 :(得分:0)
这是因为验证器发送了一个HTTP状态代码为302的响应,并且重定向始终被浏览器本身解释为GET
。
当您向用户显示页面以避免此类问题时,不应使用其他方法GET
。创建GET
路线以显示您的表单,如果有必要在POST
请求后显示表单,请使用重定向到GET
路线。