контроллер:
foreach( $request as $k => $v ) {
if( in_array( $k, ['limit', 'page' ] ) ) {
continue;
}
if( is_array( $v ) ) {
if( isset($v['type']) ) {
switch($v['type']) {
case "parent":
$criterias[] = new Criterion\ParentLocationId($v['val']);
break;
}
} if( isset( $v['like'] ) ) {
switch( $v['like'] ) {
case 0:
$criterias[] = new Criterion\FullText( $v['val'] );
break;
case 1:
$criterias[] = new Criterion\Field( $v['name'], Criterion\Operator::LIKE, $v['val'] . "%" );
break;
case 2:
$criterias[] = new Criterion\Field( $v['name'], Criterion\Operator::LIKE, "%" . $v['val'] . "%" );
break;
case 3:
$criterias[] = new Criterion\Field( $v['name'], Criterion\Operator::EQ, $v['val'] );
break;
}
} else {
$criterias[] = new Criterion\Field( $k, Criterion\Operator::IN, $v );
}
} else {
$criterias[] = new Criterion\Field( $k, Criterion\Operator::EQ, $v);
}
}
if( count( $criterias ) > 0 ) {
$query->filter = new Criterion\LogicalAnd( $criterias );
}
эта "лапша" проверяет каждое значения реквеста,
если значение текстового типа добавляет
$criterias[] = new Criterion\Field( $k, Criterion\Operator::EQ, $v);
т.е. сравнивание
если простой массив то
$criterias[] = new Criterion\Field( $k, Criterion\Operator::IN, $v );
если массив имеет ключ type то
$criterias[] = new Criterion\ParentLocationId($v['val']);
дальше эта лапша будет только расти, как я понимаю надо перейти на объекты
дальше надо предусмотреть чтобы другой программист мог определить в своем другом бандле своей type
switch($v['type']) {
case "parent":
$criterias[] = new Criterion\ParentLocationId($v['val']);
и свой кастомный класс типа Criterion который надо применить в входяшему параметру реквеста
в ООП не очень силён, подскажите как мне это грамотно сделать