【问题标题】:Yii2 Rest Controller and public variableYii2 Rest Controller 和公共变量
【发布时间】:2018-09-13 18:17:36
【问题描述】:

我用 Yii2 框架制作了一个 REST 控制器。当我尝试通过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 属性?

【问题讨论】:

    标签: rest activerecord yii2


    【解决方案1】:

    您可以重写ActiveRecord::fields() 方法以添加声明为类的公共属性的自定义字段。 fields() 方法返回其值已填充到此记录中的列的名称。

    查看您的代码,您尝试在afterFind() 中设置test 属性,并希望在调用Model::find() 方法时将该值反映到所有行。如果正确,则在模型中添加以下内容:

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

    现在当您调用\common\models\Struct::find() 时,它会返回

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

    【讨论】:

    • 像魅力一样工作。谢谢!!
    【解决方案2】:

    试试这个:

    保留您显示的所有内容,然后覆盖 getAttributes

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

    在你的控制器中返回这样的信息:return $struct; 这样做:return $struct->attributes;

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2012-10-10
      • 1970-01-01
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多