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.';
}
}
Еще интересно узнать, есть ли более элегантное решение!