如何在 Laravel 5 中验证路由参数?
Posted
技术标签:
【中文标题】如何在 Laravel 5 中验证路由参数?【英文标题】:How to validate Route Parameters in Laravel 5? 【发布时间】:2015-06-17 03:49:48 【问题描述】:如你所知,Laravel 5 改变了你调用 validator
的方式,旧的方式是调用 validator facade
,但现在在基本 Controller 类中有 ValidatesRequests
特征,但 validate
方法接受请求作为值数组,但是当您定义路由参数时,这些值不会存储在Request
中,那么如何验证这些参数?
编辑:
路线:
Route::get('/react-api/username', 'ProfileController@getUsername');
控制器:
public function getUsername(Request $request, $username)
$v = $this->validate($request, ['username' => 'required']);
那么,我该如何验证这个用户名参数?
【问题讨论】:
你能模仿你想要得到的东西吗?如果您提供更好的描述,我们当然可以让它工作 我刚刚编辑了问题,希望我现在说清楚! 哦,我明白了,让我编辑我的答案 L5 自动验证参数,只需输入提示即可(用户 $user) 【参考方案1】:假设以下路线:
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。请记住,每个 GET 和 POST 值都可以通过 Request 类访问
【讨论】:
即使我做这个验证总是失败,当我调试验证方法时我发现 $request->all() 返回空数组?我在 ajax 请求中触发此路由。 使用 Input::all() 代替,用于调试目的 与 $request->all() 返回空数组相同,但是当我在控制器操作中指定第二个参数时,作为 $username 我得到了发送的值! 这毫无意义。尝试在其他控制器或类似的东西中做一个验证器 我最终使用验证器外观并验证旧方法!谢谢@manix!【参考方案2】: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',
];
【讨论】:
【参考方案3】: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',
]);
【讨论】:
【参考方案4】:use Validator;
public function getUsername($username)
$validator = Validator::make(['username' => $username], [
'username' => 'required|string'
]);
if ($validator->fails())
return response()->json(['success' => false, 'errors' => $validator->messages()], 422);
【讨论】:
【参考方案5】: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);
【讨论】:
【参考方案6】:如果您打算直接在控制器方法中执行此操作,您可以执行以下操作:
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'
]
];
【讨论】:
好主意。在 Laravel 8 中,我们可以在合并时使用$request->route()->parameter('id')
。以上是关于如何在 Laravel 5 中验证路由参数?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.7 - 覆盖请求验证类中的 all() 方法以验证路由参数?
任何想法如何使用 vue js 和 vue 路由器在 laravel 5.3 中进行基于会话的身份验证