Laravel验证器: 防止同时提交2个参数.

问题描述 投票:0回答:2

如何防止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
laravel validation laravel-5 laravel-validation
2个回答
0
投票

你可以使用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',
]);

希望这对你有帮助


-1
投票

你不能使用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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.