Задать вопрос

Yii2 REST, почему не работает маршрутизация и псевдонимы для fields()?

Доброго дня.

Имеем:
  • VPS сервер Debian 7.8
  • Apache 2.2 (Black-end) + Nginx 1.2 (Front статика)
  • Yii2 (Base application template)
  • PostgreSQL 9+


Конфигурация:

.htaccess директории:
Options +FollowSymLinks
IndexIgnore */*

RewriteEngine On
RewriteBase /
RewriteRule ^(.*) web/index.php/$1 [QSA,L,NC]

#Блокирует доступ к бэкапам и различным файлам
<FilesMatch "(\.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)|~)$">
  Order allow,deny
  Deny from all
  Satisfy All
</FilesMatch>

#Усиливаем защиту кук
<IfModule php5_module>
  php_value session.cookie_httponly true
</IfModule>

#Блокирует просмотр директорий
<IfModule mod_autoindex.c>
  Options -Indexes
</IfModule>

#Блокирует доступ к скрытым директориям
<IfModule mod_rewrite.c>
    RewriteCond %{SCRIPT_FILENAME} -d
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)." - [F]
</IfModule>


.htaccess папки web:
AddDefaultCharset utf-8

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php


Настройки urlManager:
'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'enableStrictParsing' => false,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'code',
                ],

                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',

                'index' => 'site/index',
                '' => 'site/index',
                'auth' => 'site/auth',
                'login' => 'site/login',
                'registration' => 'site/registration',
                'OAuthCallback' => 'site/OAuthCallback',

                'profile' => 'profile/index',
            ],
],


Содержимое контроллера CodeController:
<?php
namespace app\controllers;

use yii\rest\ActiveController;

class CodeController extends ActiveController
{
    public $modelClass = 'app\models\Models';

    public function fields()
    {
        return [
            'id',            
            'mformat' => 'format',            
            'name' => function ($model) {
                return $model->format . ' ' . $model->id;
            },
        ];
    }
}


Две таблицы:

Code
id INT
id_user INT
id_model INT
code VARCHAR(12) -- 12 символьный хэш


Models
id INT
name INT
map INT
...


Что необходимо:

Настроить REST, который будет отдавать данные в виде XML из двух таблиц, связанных
через relation (hasOne). по ссылке вроде:

sitename.io/code?hash=Jgme3GnpQeL

Т.е. по хэшу мы получаем ID модели из таблицы code
А по этому ID вытаскиваем все данные из таблицы models

В чём проблема:

В первый раз пытаюсь настроить REST, делаю всё строго по официальной документации.
Но как обычно ничего не работает с первого раза.

Ссылка вида /code - возвращает все данные
Ссылка вида /code/1 - возвращает 404
Ссылка вида /code?fields=id - возвращает все ID
Ссылка вида /code?fields=id,mformat - возвращает только ID, псевдоним mformat для поля format не работает
Ссылка вида /code?fields=id,format - возвращает ID и format
Ссылка вида /code?fields=id,format,name - возвращает ID, format и name(имя точно такое-же как и в базе, без форматирования, которое указанно в контроллере)

Пытался решить проблему сам, упорно гуглил, но так и не смог понять, почему не работают псевдонимы.
extraFields так-же игнорируются. Помогите пожалуйста!

P.S. Конфигурация URLmanager-а не оптимальна, согласен. Если будут советы по его улучшению, то я с радостью их выслушаю.
  • Вопрос задан
  • 1771 просмотр
Подписаться 2 Оценить Комментировать
Решения вопроса 1
socode
@socode Автор вопроса
Web dev
Нашёл в чём была проблема.
Оказывается fields() необходимо переопределять
в МОДЕЛИ

hqdefault.jpg
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@matperez
Такое ощущение, что у вас просто fields не переопределился. Попробуйте отдебажить действия контроллера, посмотрите, что возвращает модель.
Если что, extraFields в запросе указываются через параметр expand, возможно вы пытались получить эти параметры так же, через fields.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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