我是Laravel的新手,我想要实现的是非常简单的事情,我想使用Laravel提供的FormRequest
来验证请求,但我遇到了一些难题(如果你在Laravel有经验,我确信这很容易解决)。
这是我尝试的:
我有到控制器的路由图:
Route::put('user/{name}', 'UserController@show');
我可以在show
函数中得到name
参数:
class UserController {
public function show($name)
{
// validtion rules to apply
...
}
}
我有应用于请求的验证规则,所以我决定通过php artisan make:request ShowRequest
创建表单请求,它创建表单请求类:
class ShowRequest extends FormRequest {
public function authorize()
{
return true;
}
public function rules()
{
return [
// my validation rules here
];
}
}
因为我有上面的请求类,所以我重构了控制器中的show
函数来接收ShowRequest
。
class UserController {
public function show(ShowRequest $request)
{
// now I don't need validtion rules in this function
// but how can I access the 'name' parameter now
...
}
}
我有两个问题要问:
在重构的
show
函数中,我现在如何访问路由参数name
?如果我们忘记了参数是一个名称(请不要关注要验证的名称,将其想象为要验证的对象或值)。如何添加自定义逻辑来处理验证错误,而不是使用Laravel的默认行为。我想注入如下的伪代码:
if (!$validator->pass())
{
//my custom code for handling validation failure
}
现在在哪里放置处理验证错误的自定义代码?我的意思是,我不知道在控制器的哪里有这个逻辑?在请求类中?如何?
您仍然可以在控制器的show()
方法中添加参数$name
,因为它是路由url的一部分,而不是经过验证的表单/数据。(推荐)
class UserController {
public function show(ShowRequest $request, $name)
{
//...
}
}
您也可以从请求对象
访问它class UserController {
public function show(ShowRequest $request)
{
$request->input('name');
}
}
对于错误消息(不是例外),您可以将messages()
方法添加到ShowRequest::class
class ShowRequest extends FormRequest
{
/**
* @return array
*/
public function messages()
{
return [
'name.required' => 'The name is required',
'name.numeric' => 'The name must be a number',
//...
];
}
}
如果您需要验证路由捕获的名称仅由字母组成,或者确实作为DB中的字段存在(如post的段塞),则需要在路由声明中添加一些验证。
- 设置一个只捕获由字母组成的请求的路由
Route::get('/user/{name}', 'Controller@show')->where(['name' => '[a-z]+']);
- 设置一个只在"name">
User.php
Class User //..
{
/**
* Get the route key for the model.
*
* @return string
*/
public function getRouteKeyName()
{
return 'name';
}
}
web.php
//
Route::get('/user/{user:name}', 'Controller@show');
并调整您的控制器以直接接收用户
class UserController {
public function show(ShowRequest $request, User $user)
{
//...
}
}
您可以使用这个
访问表单请求的值$validated = $request->validated();
$validated将包含FormRequest验证过的所有值。
要回答第二个问题,如果你想抛出自定义验证,你总是可以使用下面的
throw ValidationException::withMessages(['name' => 'Something is wrong']);