Validation laravel:在验证之前清理请求数据
有一个Validation laravel:在验证之前清理请求数据,validation,laravel,request,rules,Validation,Laravel,Request,Rules,有一个UpdateUserRequest表单请求,它根据rulesmathod中定义的规则验证字段值。默认情况下,它有rules()和authorize()方法。我希望防止验证和更新空字段(如密码) 有时在规则中使用是没有用的,因为html输入即使是空的,也会出现在POST请求中 array:6 [▼ "_method" => "PATCH" "_token" => "Cz79rRez2f6MG0tTU17nVwXD0X1lNGH1hA7OORjm" "name" =>
UpdateUserRequest
表单请求,它根据rules
mathod中定义的规则验证字段值。默认情况下,它有rules()和authorize()方法。我希望防止验证和更新空字段(如密码)
有时在规则中使用是没有用的,因为html输入即使是空的,也会出现在POST请求中
array:6 [▼
"_method" => "PATCH"
"_token" => "Cz79rRez2f6MG0tTU17nVwXD0X1lNGH1hA7OORjm"
"name" => "john"
"email" => "mymail@gmail.com"
"password" => ""
"password_confirmation" => ""
]
因此,我应该在使用规则中的之前删除POST请求的空键。
问题是:清除请求数组的最佳位置在哪里?
是否有任何laravel内置方法来管理此类情况
p.S:解决方案:
@Bogdon解决方案仍然有效,并且可以正常工作,但还有另一个简单、漂亮、整洁的解决方案采用自:
只需重写表单请求中的all()
方法
我不确定清除字段的最佳方式,但这就是我目前在系统上处理用户更新的方式
我根据传递的$id
找到用户,然后更新相应的记录。我假设name
和email
永远不会为空,只有密码可以为空-因此我们可以将name
和email
字段设置为传入的值,然后使用if
语句检查password
字段是否为空,并进行相应更新
我使用的是与此类似的东西:
public function update($id)
{
$user = User::find($id);
$user->name = Input::get('name');
$user->email = Input::get('email');
if (Input::get('password') != "")
{
$user->password = Hash::make(Input::get('password'));
}
$user->save();
}
要实现此功能,您需要修改App\Http\Requests\Request
类的内容,以允许对输入进行清理(类代码取自):
namespace-App\Http\Requests;
使用Illumb\Foundation\Http\FormRequest;
抽象类请求扩展了FormRequest
{
/**
*验证输入。
*
*@param\Lightning\Validation\Factory$Factory
*@return\light\Validation\Validator
*/
公共函数验证器($factory)
{
返回$factory->make(
$this->sanitizeInput(),$this->container->call([$this,'rules']),$this->messages()
);
}
/**
*清理输入。
*
*@return数组
*/
受保护的函数sanitizeInput()
{
如果(方法_存在($this,'sanitize'))
{
返回$this->container->call([$this,'sanitize']);
}
返回$this->all();
}
}
之后,只需在UpdateUserRequest
类中编写addsanitize
方法,该方法在输入为空时从输入中删除password
字段:
public function sanitize()
{
if(空($this->get('password')){
//获取所有输入
$input=$this->all();
//删除密码字段
取消设置($input['password']);
//将输入替换为修改后的输入
$this->replace($input);
}
返回$this->all();
}
现在,有时对密码字段使用规则将起作用:
公共功能规则()
{
返回[
//这里还有其他规定
“密码”=>“有时|需要|确认”
];
}
谢谢。但是如果用户打算更改密码怎么办?密码字段为空时应保持完整,密码字段为空时应更新。顺便说一下,我有两个申请表,一个用于创建新用户,另一个用于更新用户。此外,我认为没有必要在规则中添加密码确认
,只需将确认
添加到密码
。我的错,你是对的,我试图强调密码确认,但我错误地添加了确认
规则:)。除此之外,如果用户打算更新密码,只需不包括更新
字段(或者如果包括该字段,请确保该值不是1
)。简而言之:如果请求数据包含一个update=1
字段,则密码是可选的,否则它是必需的。您关注的是规则,而我正在寻找一个位置(方法)来清除请求日期,然后根据规则进行验证,然后将该数据传递给控制器中的update方法。事实上,我在考虑像服务提供商中的register
和boot
这样的register
优先于boot
的方法。哦,对不起,我被我自己的想法卡住了,我现在明白了。我已经用解决方案更新了我的答案。
public function update($id)
{
$user = User::find($id);
$user->name = Input::get('name');
$user->email = Input::get('email');
if (Input::get('password') != "")
{
$user->password = Hash::make(Input::get('password'));
}
$user->save();
}