如何在Laravel 5中验证路由参数?

Ili*_*mza 16 php validation laravel laravel-5

如你所知Laravel 5改变了你调用它的方式validator,旧的方法是调用validator facade,但现在ValidatesRequests在基类Controller类中有特征,但是该validate方法接受请求作为values数组,但是当你定义你的路由参数时,这些值不存储Request,所以如何验证这些参数?

编辑:

路线:

Route::get('/react-api/{username}', 'ProfileController@getUsername');
Run Code Online (Sandbox Code Playgroud)

控制器:

public function getUsername(Request $request, $username)
{
     $v = $this->validate($request, ['username' => 'required']);
}
Run Code Online (Sandbox Code Playgroud)

那么,问题如何验证此用户名参数?

jon*_*hot 17

如果您打算直接在控制器方法中执行此操作,则可以执行以下操作:

        public function getUser(Request $request)
    {
        $request->merge(['id' => $request->route('id')]);
        $request->validate([
            'id' => [
                'required',
                'exists:users,id'
            ]
        ]);
    }
Run Code Online (Sandbox Code Playgroud)

要在自定义FormRequest类中执行此操作,请添加以下内容:

    protected function prepareForValidation() 
    {
        $this->merge(['id' => $this->route('id')]);
    }
Run Code Online (Sandbox Code Playgroud)

在你的rules方法中:

    public function rules()
    {
        return [
            'id' => [
                'required',
                'exists:users,id'
            ]
        ];
    }
Run Code Online (Sandbox Code Playgroud)

  • 好想法。在 Laravel 8 中,我们可以在合并时使用 `$request->route()->parameter('id')` 。 (2认同)

Mit*_*tch 5

Manix的答案对我不起作用,我遇到的问题与Iliyass相同。问题是路由参数不能自动提供给FormRequest。我最终在特定的FormRequest类中重写all()函数:

public function all()
{
    // Include the next line if you need form data, too.
    $request = Input::all();
    $request['username'] = $this->route('username');
    return $request
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像往常一样编写规则:

public function rules()
{
    return [
        'username' => 'required',
    ];
}
Run Code Online (Sandbox Code Playgroud)


man*_*nix 4

假设以下路线:

Route::get('profile/{id}', 'ProfileController@show');
Run Code Online (Sandbox Code Playgroud)

id您仍然可以以 L4 方式验证参数:

public function show(){
    $validator = \Validator::make(
        \Input::all(),
        [
             'id' => ['required', 'numeric']
        ]
    );

    // run validator here
}
Run Code Online (Sandbox Code Playgroud)

如果您需要验证具体数据,请查看以下示例:

public function getUsername(Request $request, $username)
{
    $validator = \Validator::make(
        [
             'username' => $username
        ],
        [
             'username' => ['required']
        ]
    );

    // run the validator here
}
Run Code Online (Sandbox Code Playgroud)

L5 让您可以通过另外两种方式进行操作。第一个,使用Request注入到控制器中的通用类:

public function show(Request $request){
    $this->validate($request, [
        'id' => ['required', 'numeric']
    ]);

    // do stuff here, everything was ok
}
Run Code Online (Sandbox Code Playgroud)

在 L5 中,您可以调用validate()函数来接收请求和运行请求的规则。该函数负责运行规则,如果某些规则失败,则用户将被重定向到上一个请求

最后,作为第二个选项,您可以使用表单请求验证。请记住,每个 GET 和 POST 值都可以通过 Request 类访问