如何防止2个参数的呈现,存在于 required_without_all
验证器,例如
return [
'user' => 'required_without_all:customer,public',
'customer' => 'required_without_all:user,public',
'public' => 'required_without_all:user,customer',
];
如何防止用户同时提交以上两个密钥,如:
http://127.0.0.1:8000/app/groups-statistics?user=10&customer=10
这些是允许的请求。
http://127.0.0.1:8000/app/groups-statistics?user=10
http://127.0.0.1:8000/app/groups-statistics?customer=10
http://127.0.0.1:8000/app/groups-statistics?public=true
不允许。
http://127.0.0.1:8000/app/groups-statistics?pubilc=true&customer=10
http://127.0.0.1:8000/app/groups-statistics?user=10&customer=10
http://127.0.0.1:8000/app/groups-statistics?public=10&customer=10
你可以使用Validator扩展来制作自己的验证器。
在 AppServiceProvider
的把这个代码。(或在任何供应商)
public function boot(){
Validator::extend('present_only_one_from', function ($attribute, $value, $params, $validator) {
// $params = [user,customer,public]
$data = array_keys(array_filter($validator->getData())); // or you can write request()->all()
// $data = [user,customer] or [user,customer,public] or [user] ...
$intersect = array_intersect($data, $params); // returns matches of received and in validation rules
// $intersect [user,customer] && [user,customer,public] => [user,customer] => invalid
// $intersect [user] && [user,customer,public] => [user] => ($intersect[0] !== $attribute) => valid
// $intersect [customer] && [user,customer,public] => [customer] => ($intersect[0] !== $attribute) => invalid
if (count($intersect) != 1 && $intersect[0] !== $attribute) return false;
return true;
});
}
自定义验证器Closure接收四个参数:被验证的$attribute的名称,属性的$value,传递给规则的$parameters数组,以及验证器实例。
然后在任何控制器中你都可以使用这个规则。
$validator = Validator::make($request->request->all(), [
'user' => 'present_only_one_from:user,customer,public',
'customer' => 'present_only_one_from:user,customer,public',
'public' => 'present_only_one_from:user,customer,public',
]);
希望这对你有帮助
你不能使用Laravel验证器来处理URL查询字符串, 你必须使用一个中间件来代替.
<?php
namespace App\Http\Middleware;
use Closure;
class ValidateQueryString
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($public = $request->query('public')) {
if ($customer = $request->query('customer')) {
//Here both exist, handle your logic error
}
}
return $next($request);
}
}