在我的情况下,关于Laravel控制器和请求的新手问题



我是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
...
}
}

我有两个问题要问:

  1. 在重构的show函数中,我现在如何访问路由参数name?

  2. 如果我们忘记了参数是一个名称(请不要关注要验证的名称,将其想象为要验证的对象或值)。如何添加自定义逻辑来处理验证错误,而不是使用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的段塞),则需要在路由声明中添加一些验证。

  1. 设置一个只捕获由字母组成的请求的路由
Route::get('/user/{name}', 'Controller@show')->where(['name' => '[a-z]+']);
  1. 设置一个只在"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']);

相关内容

  • 没有找到相关文章

最新更新