Как проверить входные данные в YII2 для REST API?

#yii2

#yii2

Вопрос:

Как проверить входные данные в YII2 для REST API?

Вот как это делается в API, отличном от REST:

Контроллер

 <?php
namespace appcontrollers;

use Yii;
use yiiwebController;
use appmodelsIndex__GET;

class SiteController extends Controller
{
 
      public function actionIndex($ch_name_url = null)
      {
        $model = new Index__GET();
        $model->ch_name_url = $ch_name_url;

           if($model->validate()){ 
               return $this->render('index');
           }   

      }
}
 

Модель

 <?php
namespace appmodels;

use Yii;
use yiibaseModel;


class Index__GET extends Model
{

    public $ch_name_url;

    public function rules()
    {
        return [
            ['ch_name_url', 'trim'],


            ['ch_name_url', 'required'],

        ];
    }
}
 

И теперь в контроллере вызывается $model->validate() проверка данных. Как выполнить проверку входящих данных в REST API, используя yiirestController и yiirestActiveController ?

Я пытаюсь, но проверка данных завершается неудачей:

Я хочу, чтобы запрос GET включал два обязательных поля.

Но если я использую /users/123 , я получу данные, в то время как я не должен их получать из-за модели [['id', 'ch_name_url'], 'required'], .

Мне нужно /users?id=123amp;ch_name_url=myname

Контроллер

 namespace appcontrollers;

use yiirestActiveController;

class IndexController extends ActiveController
{
   public $modelClass = 'appmodelsIndex__GET';
}
 

Модель

 <?php
namespace appmodels;

use Yii;
use yiidbActiveRecord;

class Index__GET extends ActiveRecord
{
    public $id;
    public $ch_name_url;
    public $email;
    
    public static function tableName()
    {
        return 'user';
    }

    public function fields()
    {
        return ['id', 'ch_name_url', 'email'];
    }
    
    public function rules()
    {
        return [

            [['id', 'ch_name_url'], 'required'],
        ];
    }
}
 

Комментарии:

1. actionIndex и ActionView ActiveController по умолчанию не вызываются $model->validate() , поэтому правила не используются. Например, код, который выполняется в вашем примере, находится здесь , если вы его проверите, вы увидите, что он вызывает только checkAccess и, если true, возвращает модель. Вам нужно реализовать свой собственный метод, если вы хотите проверить соответствие правилам.

2. @RaulSauco Спасибо!

Ответ №1:

Просто создайте контроллер, расширяющийся от yiirestActiveController , затем validate он запустится автоматически. Сделайте что-то вроде этого:

 namespace appcontrollers;

use yiirestActiveController;

class IndexController extends ActiveController
{
   public $modelClass = 'appmodelsIndex__GET';
}
 

$model->validate() вызывается по умолчанию при вызове $model->save() , но если вам нужно проверить модель в действии, сделайте это, как вы делали в примере кода вашего вопроса.

Просто помните, что действия из REST используются немного иначе, чем обычный вызов, где actionIndex обычно это не требуется.

Для получения дополнительной информации следуйте оригинальным документам: REST Quick Start

Комментарии:

1. Спасибо! Я редактирую свой вопрос. Прочитайте, пожалуйста. Я хочу, чтобы запрос GET включал два обязательных поля. И данные не проверяются, если я использую запрос GET с параметрами.

2. @TamaraSec Затем вы должны обновить свой rules и tokens взглянуть на этот пост, добавляя параметры в Rest api , и следовать этому официальному руководству с примерами .

3. Но проверка не работает. Я добавил правило в modele ['id', 'in', 'range' => [0, 5]], и сделал запрос GET. /api/v1/user/1 и я получаю данные.

4. Такого рода проверка не должна выполняться в правилах! Правила предназначены для проверки правильности модели. Что вы хотите, так это отфильтровать возможные результаты. Взгляните на фильтры Yii2.

5. Что вы хотите, так это отфильтровать возможные результаты. —> Нет. Я хочу проверить данные перед выполнением запроса к базе данных.