防止 Laravel 中无效后重定向到主页

问题描述 投票:0回答:4

我正在使用 Laravel 5.3 开发 RESTful API,因此我正在使用我的控制器测试一些功能和请求。我需要做的一件事是在数据库中添加字段之前验证用户发送的请求,因此,我使用自定义 FormRequest 来验证它。

当我在 Postman 中测试我的 API 并发送无效请求时,响应将我重定向到主页。阅读文档后,我发现以下说法

如果验证失败,将生成重定向响应以发送 用户返回到之前的位置。错误也会闪现 到会话,以便它们可供显示。如果请求是 AJAX 请求,带有 422 状态代码的 HTTP 响应将是 返回给用户,包括验证的 JSON 表示形式 错误。

如何防止这种情况发生?或者Postman中有AJAX模式?有什么建议吗?

php ajax laravel postman
4个回答
95
投票

这也可以在不重写任何函数的情况下实现。 Laravel 旨在支持

Json
和普通页面。 请更改
postman
中的设置,并将
Accept
设置为
application/json
,如下所示

Laravel 很聪明;-)


10
投票

您的自定义 FormRequest 扩展了

Illuminate\Foundation\Http\FormRequest
。其中有一个执行重定向的函数,称为
response()
。只需在您的自定义 FormRequest 中覆盖此函数即可更改响应无效验证的方式。


namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\JsonResponse;

class CustomFormRequest extends FormRequest
{
    /**
     * Custom Failed Response
     *
     * Overrides the Illuminate\Foundation\Http\FormRequest
     * response function to stop it from auto redirecting
     * and applies a API custom response format.
     *
     * @param array $errors
     * @return JsonResponse
     */
    public function response(array $errors) {

        // Put whatever response you want here.
        return new JsonResponse([
            'status' => '422',
            'errors' => $errors,
        ], 422);
    }
}

10
投票

我在 Laravel 8 中遇到了同样的问题。在你的请求类中,你可以重写 failedValidation 方法。

<?php

...
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;


class RegisterRequest extends FormRequest
{

    ...

    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(response()->json(['errors' => $validator->errors()], 422));
    }

    ...


}

0
投票

在 Laravel 10 中,您有几种方法可以实现这一目标:

命名路线

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ExampleRequest extends FormRequest
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        
       /**
        * The route to redirect to if validation fails.
        */
        $this->redirectRoute = 'named.example.route';
    
        return [
            //User inputs => validation rules 
        ];
    }
}

带参数的命名路由

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ExampleRequest extends FormRequest
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        $this->redirect = route(
            'named.example.route',
            ['example_param' => $this->param_value]
        );
        return [
            //User inputs => validation rules 
        ];
    }
}

控制器操作

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ExampleRequest extends FormRequest
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {

       /**
        * The controller action to redirect to if validation fails.
        */
        $this->redirectAction = "ExampleController@exampleAction";

        return [
            //User inputs => validation rules 
        ];
    }
}

返回

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ExampleRequest extends FormRequest
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {

        $this->redirect = url()->previous();

        return [
            //User inputs => validation rules 
        ];
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.