【问题标题】:Laravel 5.6 - the validate() function doesn't return 422 with invalid input [duplicate]Laravel 5.6 - validate() 函数不返回 422 无效输入 [重复]
【发布时间】:2018-12-31 11:42:08
【问题描述】:

根据 Laravel 5.6 的doc

在 AJAX 请求期间使用 validate 方法时,Laravel 不会生成重定向响应。相反,Laravel 会生成一个 JSON 响应......这个 JSON 响应将发送一个 422 HTTP 状态码。

我真的看不出它是否返回 422。

这是我的实验的 sn-p。

public function registerWithEmail(Request $request)
{
    request()->validate([
        'name'     => ['required'],
        'email'    => ['required', 'email', 'unique:customers'],
        'password' => ['required', 'min:6'],
    ]);

    return Customer::create([
        'name'     => $request->input('name'),
        'email'    => $request->input(email),
        'password' => Hash::make($request->input(password)),
    ]);
}

当输入数据有效时,HTTP状态码为201。

但是,当它无效时,代码是302。

例如...

/** @test */
public function canNotRegisterCustomerWithSameEmail()
{
    $response = $this->post('/api/register', [
        'name'     => 'Valid Input',
        'email'    => 'blah@example.com',
        'password' => 'secret',
    ]);

    $response2 = $this->post('/api/register', [
        'name'     => 'Duplicate Email i.e. invalid',
        'email'    => 'blah@example.com',
        'password' => 'secret',
    ]);

    $response->assertStatus(201);
    //This is fine.
    $response2->assertStatus(422);
    //This fails, resulting in
    //"Expected status code 422 but received 302."

    $this->assertEquals(1, Customer::count());
    //This is fine
}

你看到我做错了什么吗? 任何建议将不胜感激。

【问题讨论】:

  • 这很明显。当它无效时,它会将您重定向到一个表单以进行一些修复。因此你得到302

标签: php laravel


【解决方案1】:

您正在使用post 方法,它 模仿AJAX 请求。对于验证失败的常规 HTTP 请求,Laravel 会返回 302,以便浏览器将您重定向回上一页。

要测试控制器对 AJAX 请求的响应,请使用 json 方法:

$this->json('post', '/api/register', [
    'name'     => 'Duplicate Email i.e. invalid',
    'email'    => 'blah@example.com',
    'password' => 'secret',
]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2019-07-08
    相关资源
    最近更新 更多