Yii2 rest controller и общедоступная переменная

Я сделал контроллер 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, не добавляя пустое поле в мою таблицу базы данных?

3
0
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Ответ принят как подходящий

Вы можете переопределить метод 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"}

Работайте как шарм. Спасибо!!

mr.krash 14.09.2018 08:50

Другие вопросы по теме