Валидация вложенных структур

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nds
Сообщения: 26
Зарегистрирован: 2017.09.05, 07:57

Валидация вложенных структур

Сообщение nds »

Например нужно провалидировать данные вида:

Код: Выделить всё

$input = [
	'freeKey' => 'freeData',
	'checkedKey' => [
		[ 'itemKey' => 22 ],
		[ 'itemKey'  => 45 ],
		// ...
	],
];
в других фреймворках встречал нечто подобное на эту тему:

Код: Выделить всё

public function rules() {
	return [
		[ 'checkedKey.*.itemKey', 'required' ],
	];
}
Имеется ли в Yii2 данная возможность?
Если нет то как решить данную проблему?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Валидация вложенных структур

Сообщение yiiliveext »

Код: Выделить всё

public function rules() {
	return [
		[ 'checkedKey', 'each', 'rule' => 'required' ],
	];
}
nds
Сообщения: 26
Зарегистрирован: 2017.09.05, 07:57

Re: Валидация вложенных структур

Сообщение nds »

не пойдет, данный код спокойно пропустит такую структуру:

Код: Выделить всё

$input = [
	'arr' => [
		[ 'itemKey' => '' ],
		[ 'itemKey' => '' ],
	]
];
и такую:

Код: Выделить всё

$input = [
	'arr' => [
		[],
		[],
	]
];
а нужно проверить на required значение по пути: arr.*.itemKey, где * - любой элемент массива
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Валидация вложенных структур

Сообщение yiiliveext »

Как-то так

Код: Выделить всё

public function rules() {
	return [
		[ 'checkedKey', 'each', 'rule' => ['filter',  'filter' => function($values) {
                                                                                          foreach ($values as $value) {
		                                                                               if (value not is good) {
		                                                                                  return null;
		                                                                               } 
		                                                                           }              	                                                                
		      	                                                                }
		      	                                      ],
		[ 'checkedKey', 'each', ['required']],      	                                      
		];
}
Ответить