Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation laravel:在验证之前清理请求数据_Validation_Laravel_Request_Rules - Fatal编程技术网

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
类中编写add
sanitize
方法,该方法在输入为空时从输入中删除
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();
    }