【发布时间】:2017-05-26 13:03:39
【问题描述】:
我正在编写一个多步骤注册表单。第一步,我需要收集first_name、last_name和dob,然后创建一个Customer对象只有这三个字段:
// RegistrationController.php
public function store_profile(Request $request) {
$rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
$this->validate($request, $rules);
Customer::create($request);
}
问题是其他字段,例如address、city、state等也可以填写:
// 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...
}
因此,我的目标是通过在我的验证 $rules 变量中定义的数组键过滤 $request->all() 字段。这是我的尝试:
$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_column 或array_intersect_key 或其他方法,可能无需手动循环?其次,有没有我不知道的更像 Laravel 的方法?
【问题讨论】:
标签: php laravel validation laravel-5.3