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

时间:2015-04-11 13:01:09

标签: php validation laravel laravel-5

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

编辑:

路线:

Route::get('/react-api/{username}', 'ProfileController@getUsername');

控制器:

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

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

6 个答案:

答案 0 :(得分: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
}

然后您可以正常编码规则:

public function rules()
{
    return [
        'username' => 'required',
    ];
}

答案 1 :(得分:2)

public function listTurns($doctor_id, $limit, $offset){
        $r = [
            'doctor_id' => $doctor_id,
            'limit' => $limit,
            'offset' => $offset,
        ];

        $validator = Validator::make($r, [
            'doctor_id' => 'required|numeric|min:1|exists:doctors,id',
            'limit' => 'required|numeric|min:1',
            'offset' => 'required|numeric|min:0',
        ]);
}

答案 2 :(得分:0)

支持以下路线:

Route::get('profile/{id}', 'ProfileController@show');

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

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

    // run validator here
}

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

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

    // run the validator here
}

L5让你以另外两种方式做。第一个,使用在控制器中注入的通用Request类:

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

    // do stuff here, everything was ok
}
  

在L5中,您可以调用接收请求的 validate()函数以及在其上运行的规则。此函数负责运行规则,如果某些规则失败,则将用户重定向到先前的请求

最后,作为第二个选项,您可以使用Form request validation。请记住,可以通过Request class

访问每个GET和POST值

答案 3 :(得分:0)

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

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

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

    protected function prepareForValidation() 
    {
        $this->merge(['id' => $this->route('id')]);
    }

并使用您的rules方法:

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

答案 4 :(得分:-1)

- nameA2:xxxx
- nameB2:xxxx

答案 5 :(得分:-1)

use Illuminate\Support\Facades\Validator;

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

    if ($validator->fails()) {
      return response()->json(['status' => 'error'], 400);
    }
}
相关问题