Проверка массива в Laravel с использованием пользовательского правила с дополнительным параметром - PullRequest
0 голосов
/ 03 марта 2019

Я работаю с Laravel 5.7 и мне нужно проверить длину телефона, используя 2 входа (префикс + номер).Общее количество цифр должно быть всегда 10.

Я использую это пользовательское правило для других проектов, которое прекрасно работает:

<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;

class PhoneLength implements Rule
{
    public $prefix;

/**
 * Create a new rule instance.
 *
 * @return void
 */
public function __construct($prefix = null)
{
    //
    $this->prefix = $prefix;
}

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{
    //
    return strlen($this->prefix)+strlen($value) == 10 ? true : false;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return 'El Teléfono debe contener 10 dígitos (prefijo + número)';
}
}

В моем контроллере я делаю что-то вроде

$validatedData = $request->validate([
  'prefix' => 'integer|required',
  'number' => ['integer','required', new PhoneLength($request->prefix)],
]);

Теперь мне нужно использовать массивы, поэтому моя новая проверка выглядит так:

$validatedData = $request->validate([
  'phones.*.prefix' => 'required',
  'phones.*.number' => ['required', new PhoneLength('phones.*.prefix')],
]);

Приведенный выше код не работает вообще, параметр не отправляется, как ожидалось.Как я могу отправить значение массива?Конечно, мне нужно получить значения из одного и того же элемента массива, поэтому, если phones[0].number проходит проверку, нужен префикс phones[0].prefix.

Я нашел этот вопрос, но я отказываюсь верить, чтоНевозможно сделать «родным» способом: Проверка массива Laravel с пользовательским правилом

Заранее спасибо

1 Ответ

0 голосов
/ 03 марта 2019

Вы можете получить $prefix из самого запроса:

class PhoneLength implements Rule
{
    public function passes($attribute, $value)
    {
        $index = explode('.', $attribute)[1];
        $prefix = request()->input("phones.{$index}.prefix");
    }
}

или передать $request в конструкторе правил PhoneLength, а затем использовать его.

...