Yii2 Rest Controller и открытая переменная - PullRequest
0 голосов
/ 13 сентября 2018

Я сделал REST-контроллер с каркасом Yii2. Когда я пытаюсь извлечь запись из моей базы данных по модели ActiveRecord, JsonFormatter дает мне только реальные атрибуты. Как можно настроить JsonFormatter, чтобы дать мне также публичную переменную? Это мой код:

Контроллер

class MyController extends yii\rest\ActiveController
{
    ...

    public function actionView($id)
    {
        $struct = \common\models\Struct::find()->where(['id' => '285'])->One();
        if ($struct) {
            return $struct;
        }
        return false;
    }
}

Модель

/**
* property string $id;
* property string $name;
*/
class Struct extends \yii\db\ActiveRecord
{
    public $test;
    ...
    public function afterFind()
    {
        parent::afterFind();
        $this->test = 'ok';
    }
}

результат запроса

{"id":1,"name": "ciccio"}

но если я напечатаю переменную с print_r(), у меня будет весь объект

\app\models\Struct object
(
    [test] => ok
    [_attributes:yii\db\BaseActiveRecord:private] => Array
    (
        [id] => 1
        [name] => ciccio
    )
)

Как получить свойство переменной test без добавления пустого поля в таблицу базы данных?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы можете переопределить метод ActiveRecord::fields(), чтобы добавить настраиваемое поле, которое объявлено как открытое свойство класса.Метод fields() возвращает имена столбцов, значения которых были введены в эту запись.

Глядя на свой код, вы пытаетесь установить свойство test внутри afterFind() и хотите, чтобы это значение отражалось на всех строках при вызове метода Model::find().Если это правильно, то добавьте следующее в вашу модель:

public function fields() {
    $fields = parent::fields();
    $fields['test'] = 'test';
    return $fields;
}

Теперь, когда вы вызываете \common\models\Struct::find(), он вернет

{"id":1,"name": "ciccio","test":"ok"}
0 голосов
/ 14 сентября 2018

Попробуйте это:

сохранить все, что вы показали, а затем переопределить getAttributes

public function getAttributes($names = null, $except = [])
    {
        return array_merge(['test'=>$this->test], parent::getAttributes($names, $except));
    }

и в вашем контроллере истекает возврат, как это: return $struct; сделать это так: return $struct->attributes;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...