Laravel 5 Пользовательское правило проверки для элементов в массиве со ссылкой на другие поля

Я пытаюсь выяснить, как я могу проверить некоторые данные на основе других входных данных. И чтобы сделать это еще более сложным, и данные, и другие входные данные находятся в массиве. Вот правила:

    $rules = [];
    $rules['items.*.articleId'] = ['required', 'integer'];
    $rules['items.*.data'] = ['required', new ItemData()];

Способ проверки данных должен основываться на articleId текущего элемента. Таким образом, вопрос заключается в том, существует ли способ узнать articleId (элемента) в ItemData-правиле?

1 ответ

Я нашел по крайней мере одно (несколько громоздкое) решение:

  • Обеспечить правило всем вводом
  • Разобрать атрибут $ в passes метод
  • Используйте это, чтобы найти articleId во входных данных

Класс ItemData:

    namespace App\Rules;

    use Illuminate\Contracts\Validation\Rule;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Support\Facades\Schema;

    class OrderItemData implements Rule {

        private $_input = null;

        public function __construct($input) {
            $this->_input = $input;
        }

        public function passes($attribute, $value) {
            $idParts = explode('.', $attribute);
            array_pop($idParts);
            $imp = $this->_input;
            foreach ($idParts as $idPart) {
                $imp = $imp[$idPart];
            }

            $articleId = $imp['articleId'];

            // do some checking here..

            return true;
        }

        public function message() {
            return ':attribute is invalid.';
        }
    }

Еще интересно узнать, есть ли более элегантное решение!

Другие вопросы по тегам