humiliation
@humiliation
Чем больше знаю - тем больше дурак

Возможно без переопределения ActiveController методов получить записи конкретного пользователя?

Наследуюсь от ActiveController. Сейчас при гет обращении к index получаю ВСЕ записи. Как ограничить получение записей именно тем юзером, что запрашивает? Я к тому, что можно без переопределения дефолтного поведения куда-нибудь вписать ограничения? checkAccess какой-нибудь, например. Или нельзя и нужно переопределять дефолтные методы и использовать поисковую модель?
  • Вопрос задан
  • 569 просмотров
Пригласить эксперта
Ответы на вопрос 1
kimono
@kimono
Web developer
Если дело только в actionIndex, то вам придется как минимум отнаследоваться от ActiveController и использовать свой IndexAction:
class MyActiveController extends yii\rest\ActiveController {
  public function actions(){
    return ArrayHelper::merge(parent::actions(), [
      'index' => [
        'class' => 'common\components\IndexAction'
      ]
    ]);
  }
}

class IndexAction extends yii\rest\IndexAction {
    /**
     * Prepares the data provider that should return the requested collection of the models.
     * @return ActiveDataProvider
     */
    protected function prepareDataProvider()
    {
        $requestParams = Yii::$app->getRequest()->getBodyParams();
        if (empty($requestParams)) {
            $requestParams = Yii::$app->getRequest()->getQueryParams();
        }

        $filter = null;
        if ($this->dataFilter !== null) {
            $this->dataFilter = Yii::createObject($this->dataFilter);
            if ($this->dataFilter->load($requestParams)) {
                $filter = $this->dataFilter->build();
                if ($filter === false) {
                    return $this->dataFilter;
                }
            }
        }

        if ($this->prepareDataProvider !== null) {
            return call_user_func($this->prepareDataProvider, $this, $filter);
        }

        /* @var $modelClass \yii\db\BaseActiveRecord */
        $modelClass = $this->modelClass;

        // чтобы переделать это
        //$query = $modelClass::find();
        $query = $modelClass::find()->where(['user_id' => Yii::$app->user->id]);
        if (!empty($filter)) {
            $query->andWhere($filter);
        }

        return Yii::createObject([
            'class' => ActiveDataProvider::className(),
            'query' => $query,
            'pagination' => [
                'params' => $requestParams,
            ],
            'sort' => [
                'params' => $requestParams,
            ],
        ]);
    }
}

PS: и это при условии, что все модели, к которым идёт обращение через этот контроллер, имеют user_id.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы