#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. Что вы хотите, так это отфильтровать возможные результаты. —> Нет. Я хочу проверить данные перед выполнением запроса к базе данных.