【问题标题】:MethodNotAllowedHttpException using Form Request Validation on Laravel 5.5MethodNotAllowedHttpException 在 Laravel 5.5 上使用表单请求验证
【发布时间】:2018-06-16 14:05:31
【问题描述】:

当我在 Laravel 5.5 上使用 Form Request Validation 时,这很奇怪,我所有的帖子请求都将是 405 Method Not Allowed,但是当我使用标准验证时变得正常,我的代码是:

php artisan route:list

+--------+----------+----------------------------------------+--------------------+-----------------------------------------------------------+------------+
| Domain | Method   | URI                                    | Name               | Action                                                    | Middleware |
+--------+----------+----------------------------------------+--------------------+-----------------------------------------------------------+------------+
|        | POST     | api/register                           |                    | App\Http\Controllers\AuthController@register              | api        |
+--------+----------+----------------------------------------+--------------------+-----------------------------------------------------------+------------+

使用insomnia 请求:

我失眠时的base_api值为http://mylocal.app/api

错误信息:

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException

错误显示信息:

路由器(api.php):

Route::post('register', 'AuthController@register');

控制器(AuthController.php):

use App\Http\Requests\StoreRegistration;

public function register(StoreRegistration $request)
{

    $email = $request->email;
    $name = $request->name;
    $password = $request->password;

    $user = User::create([
        'name' => $name,
        'email' => $email,
        'password'  => Hash::make($password)
    ]);

    $verifyUser = VerifyUser::create([
        'user_uuid' => $user->uuid,
        'token' => str_random(100)
    ]);

    SendVerificationEmail::dispatch($user); //I use queue to send email

    return response()->json(['success' => true, 'message' => 'message on success']);
}

StoreRegistration.php

class StoreRegistration extends FormRequest {
public function authorize()
{
    return true;
}

public function rules()
{
    return [
        'name' => 'required|min:4|max:50|unique:users|alpha_dash',
        'email' => 'email|required|max:255|unique:users',
        'password' => 'required|confirmed|min:6'
    ];
}
}

这个问题让我抓狂。

【问题讨论】:

  • 请出示您用来执行register()方法的表单或链接。
  • 更新了@AlexeyMezenin
  • 跟走错路线有关
  • 我怀疑自己路由没有问题,当我使用标准请求进行更改时,它可以正常工作。 @user2486
  • 告诉我们你的确切错误

标签: laravel validation laravel-5


【解决方案1】:

当您从 insomnia 发送请求时,请确保添加标头;

接受:application/jsonContent-Type: application/json

这样,laravel 知道它是一个 api 请求,并将使用在 api.php 而不是 web.php 路由上定义的路由。

【讨论】:

  • @Leo 它在所有版本的 laravel 上都可用吗??
  • 我不敢相信我为此浪费了一个小时——尤其是当我为我自己的 API 编写文档并要求使用 Accept 标头时。谢谢你的回答。
【解决方案2】:

错误不是来自验证。

这是因为当您使用 FormRequest 类时,您使用的是其默认的 failedValidation 方法,该方法用于 Web 并重定向到前一页时出错。在您的情况下,您正在使用 api 但它重定向到一个不存在的 url。当您使用标准验证时,您正在指定自己的逻辑。

throw new ValidationException($validator, $this->response(
        $this->formatErrors($validator)
    ));

因此,您需要使用您的 api 进行自定义失败验证方法。您可以在 StoreRegistration 类中执行类似操作,您可以将 failedValidation 方法重写为以下 -

public $validator = null;
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
    $this->validator = $validator;
}

然后是你的控制器方法,用你的 $validator 对象做任何你想做的事情。可能类似于以下内容-

if (isset($request->validator) && $request->validator->fails()) {
    return response()->json($request->validator->messages(), 400);
}

看看我之前回答的this链接。

【讨论】:

  • 还是没看懂,哪一部分逻辑错了?我该怎么办?给我一个线索。
猜你喜欢
  • 2018-09-15
  • 2018-06-30
  • 2018-09-13
  • 2018-05-02
  • 2018-07-13
  • 2018-06-26
  • 2016-09-02
  • 2017-10-23
相关资源
最近更新 更多