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-а не оптимальна, согласен. Если будут советы по его улучшению, то я с радостью их выслушаю.
  • Вопрос задан
  • 1764 просмотра
Решения вопроса 1
socode
@socode Автор вопроса
Web dev
Нашёл в чём была проблема.
Оказывается fields() необходимо переопределять
в МОДЕЛИ

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

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

Войти через центр авторизации
Похожие вопросы