如何通过验证规则中的键过滤请求数据?

时间:2017-01-11 16:30:34

标签: php laravel validation laravel-5.3

我正在制作一个多步骤的注册表单。在第一步中,我需要收集first_namelast_namedob,然后创建仅包含这三个字段的Customer对象

// RegistrationController.php
public function store_profile(Request $request) {
    $rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
    $this->validate($request, $rules);

    Customer::create($request);
}

问题是其他字段,例如addresscitystate也可填写

// Customer.php
protected $fillable = ['first_name', 'last_name', 'dob', 'address', 'city', 'state', ...];

我打算在注册的第二步(public function store_address())中收集它们,但没有任何内容可以阻止用户POST将这些附加字段添加到第一步:

// RegistrationController.php
public function store_profile(Request $request) {
    $rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
    $this->validate($request, $rules); // won't validate 'address', 'city', 'state'

    Customer::create($request); // will store everything that's fillable,
                                // no matter if it was validated or not...
}

因此,我的目标是通过验证$request->all()变量中定义的数组键过滤$rules个字段。这是我的尝试:

$data = [];
foreach(array_keys($rules) as $key) {
    $val = $request->{$key};
    if (! empty($val))
        $data[$key] = $val;
}
// in the end, $data will only contain the keys from $rules
// i.e. 'first_name', 'last_name', 'dob'

首先,是否有更有效/简洁的方法使用array_columnarray_intersect_key或其他方式,可能没有手动循环?第二,是否有更多类似Laravel的方法,我不知道?

2 个答案:

答案 0 :(得分:7)

noncentral_chisquare(和only())怎么样?

except()

Customer::create($request->only(['first_name', 'last_name', 'dob']));

编辑:在Laravel 5.5中,有another solution

Customer::create($request->only(array_keys($rules)));

答案 1 :(得分:0)

如果我是你,我会这样做的:

public function store_profile(Request $request) {
    $rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
    $this->validate($request, $rules); // won't validate 'address', 'city', 'state'

    Customer::create([
        'first_name' => $request->input('first_name');
        'last_name'  => $request->input('last_name');
        'dob'        => $request->input('dob');
    ]); 

}

甚至更简单:

Customer::create($request->only(['first_name', 'last_name', 'dob']));