2

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

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

Controller

<?php
namespace app\controllers;

use Yii; use yii\web\Controller; use app\models\Index__GET;

class SiteController extends Controller {

  public function actionIndex($ch_name_url = null)
  {
    $model = new Index__GET();
    $model-&gt;ch_name_url = $ch_name_url;

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

  }

}

Model

<?php
namespace app\models;

use Yii; use yii\base\Model;

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, используя при этом yii\rest\Controller и yii\rest\ActiveController?

Tamara Sec
  • 23
  • 3
  • Все точно также. В рестах можно делать такие же свои экшены. Но вам надо в срочном порядке сменить учителя или уйти с этого проекта. Либо почитайте PSR. – fedornabilkin Dec 18 '20 at 16:30
  • @fedornabilkin Благодарю! А что не так? Модель неправильно именована Index__GET? Лишние пробелы? – Tamara Sec Dec 18 '20 at 21:24

1 Answers1

1

В более менее крупных проектах коробочного варианта реста не хватает, поэтому сразу от него отказываются и делают свои экшены. Вот, например рестовый экшн для добавления товара к заказу.

public function actionCreate()
{
    $params = App::request()->bodyParams;
    $order = OrderService::findModel($params['orderId']);
// Если не доставка и статус заказа не Изменен, то запрещаем добавление товара
if (!$order-&gt;delivery || !$order-&gt;orderStatus()-&gt;canAddProduct()) {
    throw ExceptionFactory::actionDenied();
}

$orderProduct = new OrderProduct();

// загрузка данных в модель и сохранение с валидацией
if (!$orderProduct-&gt;load($params, '') || !$orderProduct-&gt;save()) {
    throw ExceptionFactory::incorrectData();
}

$this-&gt;createEventCallback($order);

return $orderProduct;

}

  • Благодарю! Вот это похоже на разумную концепцию. Но почему Вы не проверяете входящие данные? $params['orderId'] – Tamara Sec Dec 18 '20 at 21:20
  • Да, тут косяк, надо проверку делать дополнительно. – fedornabilkin Dec 20 '20 at 15:23
  • Спасибо! Вы имеете в виду проверку в качестве модели, такой, как обычно эта делается через yii\base\Model? – Tamara Sec Dec 20 '20 at 16:31
  • isset($params['orderId']) я про эту. – fedornabilkin Dec 21 '20 at 15:40
  • Благодарю! Но, разве Вы не считаете нужным проверять входящие данные на сервер, которые взаимодействуют с базой-данных? – Tamara Sec Dec 23 '20 at 23:06
  • Так валидация же в моделях. Там все проверки. – fedornabilkin Dec 25 '20 at 15:01