当我从之前的帖子路线进行修补时,MethodnotallowedExeption

时间:2017-11-11 18:23:39

标签: php laravel laravel-5 laravel-routing laravel-validation

首先,它不是我向错误的路由动词发送请求的入门级错误。

我的情况就是这样:我有一条路线

synchronized

当我点击此路线时,我有一个随机表单来更新特定的用户详细信息。事情就是当我提交表格时,它会去路线:

Route::post('/user/edit', 'UserController@edit');

一切正常。但我想添加一小部分验证,因此用户不会向我发送相同的现有数据,因此我添加了验证:

Route::put('user/update','UserController@update'); 

事情就是当验证踢它重新定向回来时我可以手动捕获会话的消息,我看到验证工作正常,它应该发送回第一个路由但我得到一个方法不允许异常。我假设验证基方法发回GET请求?

任何想法如何解决这个问题>

3 个答案:

答案 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路线。