Laravel 5.6-validate()函数不会使用无效输入返回422

时间:2018-07-23 23:54:12

标签: php laravel

根据Laravel 5.6的doc

  

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

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

这是我的实验摘要。

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
}

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

1 个答案:

答案 0 :(得分:3)

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

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

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