当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何通过验证规则中的键过滤请求数据?》经验,为你挑选了1个好方法。

我正在制作一个多步骤的注册表格.在第一步中,我需要收集first_name,last_namedob,然后创建一个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', ...];

我打算在注册的第二步(in 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的方法,我不知道?



1> halloei..:

怎么样only()(和except())?

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

要么

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

编辑:在Laravel 5.5中,有另一种解决方案:

$rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
$data = $this->validate($request, $rules);

Customer::create($data); // $data contains only first_name, last_name and dob

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有