Как безопасно генерировать ActiveQuery с параметрами строки запроса, определенными клиентом, в Yii2? - PullRequest
0 голосов
/ 08 октября 2018

Есть ли безопасный способ создания условного предложения для Yii2 ORM с строкой запроса параметрами?Например, нам требуется список некоторых пищевых продуктов, фильтрующих по их свойствам:

GET /food/?weight[>]=1000&calories=[<]=200

И существует множество различных свойств продуктов: вес, калории, количество, цена.

Я ожидаю, что можно написать что-то вроде (упрощенный код):

 $query = new \yii\db\Query();
 foreach ($_GET as $parameter => $condition){
    foreach ($condition as $operator => $value){
        $query->where(new SimpleCondition($parameter, $operator, $value));
    }
 }

Но я сомневаюсь этот подход безопасен .

Итак, есть три вопроса:

  1. Как можно безопасно определить свойства из URL?Можем ли мы очистить параметр строки запроса names (не values ​​) перед использованием в предложении ActiveQuery::where?
  2. Как правильно определить операторы, такие как IN, AND, OR, >, <, >=, <=, etc.?
  3. Есть ли какой-нибудь собственный компонент Yii2 для фильтрации или мне следует использовать сторонний модуль?

1 Ответ

0 голосов
/ 08 октября 2018

Наконец-то я нашел решение.Похоже, что Yii2 предоставляет такую ​​функциональность с классом DataFilter.Официальная документация класса и руководство по его использованию

Согласно документации

  1. Определите модель дляпроверка.

    class SearchModel extends \yii\base\Model
    {
        public $id;
        public $name;
    
        public function rules()
        {
            return [
                [['id', 'name'], 'trim'],
                ['id', 'integer'],
                ['name', 'string'],
            ];
        }
    }
    
  2. Создайте фильтр:

    $filter = new DataFilter(['searchModel' => $searchModel]);
    
  3. Заполните фильтр данными, подтвердите

    if ($filter->load(\Yii::$app->request->get())) { 
       $filterCondition = $filter->build();
       if ($filterCondition === false) { // if error occure
           // the errors are stored in the filter instance
           return $filter;
       }
    }
    
  4. Использовать встроенное условие в Query фильтре

    $query->andWhere($filterCondition);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...