Laravel валидаторы: запретить отправку 2 параметров вместе - PullRequest
0 голосов
/ 27 апреля 2020

Как запретить подарки 2 параметров, которые существовали в валидаторе required_without_all, например:

    return [
        'user' => 'required_without_all:customer,public',
        'customer' => 'required_without_all:user,public',
        'public' => 'required_without_all:user,customer',

    ];

Как запретить пользователю отправлять 2 ключа вместе, например:

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Вы можете использовать расширение 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;
  });
}

Пользовательский validator Closure получает четыре аргумента: имя проверяемого атрибута $, значение атрибута $, массив параметров, передаваемых правилу, и экземпляр Validator.

Затем в любом контроллере Вы можете использовать эти правила:

$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',
]);

надеюсь, это поможет вам

0 голосов
/ 27 апреля 2020

Вы не можете использовать 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);
    }
}
...