更改一个属性值yii2restapi

更改一个属性值yii2restapi,rest,yii2,yii2-model,Rest,Yii2,Yii2 Model,我使用ActiveController在Yii2中创建了一个restapi。actionIndex的默认实现返回所有模型。 我想做的是在发送响应之前更改一个属性的值。 例如,我上传了一张图片,图片的名称存储在数据库中。 在发送响应之前,我希望嵌入带有图像名称的基本URL。 我是否需要覆盖整个索引方法,或者我可以在action方法中操作单个属性?我认为最简单的方法是覆盖模型中的fields()方法。假设您为名为YourFile的模型配置了ActiveController。如果将以下函数添加到You

我使用
ActiveController
在Yii2中创建了一个restapi。
actionIndex
的默认实现返回所有模型。 我想做的是在发送响应之前更改一个属性的值。 例如,我上传了一张图片,图片的名称存储在数据库中。 在发送响应之前,我希望嵌入带有图像名称的基本URL。
我是否需要覆盖整个索引方法,或者我可以在
action
方法中操作单个属性?

我认为最简单的方法是覆盖模型中的
fields()
方法。假设您为名为
YourFile
的模型配置了ActiveController。如果将以下函数添加到
YourFile
模型,则可以为响应中的每个模型添加完整url:

public function fields() {
    return [
        'id',
        'name' => function() {
            return Url::base(true) . $this->name;
        }
    ]
}

如果您这样添加它,这确实意味着在您的模型上调用
toArray()
的每一个代码都会得到这个结果。如果您只希望在
ActiveController
上实现这一点,那么您可能希望扩展
YourFile
模型,并仅在其中包含
fields()
方法,这样您就可以用扩展版本配置
ActiveController

我认为最简单的方法是覆盖
字段()
模型中的方法。假设您为名为
YourFile
的模型配置了ActiveController。如果将以下函数添加到
YourFile
模型,则可以为响应中的每个模型添加完整url:

public function fields() {
    return [
        'id',
        'name' => function() {
            return Url::base(true) . $this->name;
        }
    ]
}

如果您这样添加它,这确实意味着在您的模型上调用
toArray()
的每一个代码都会得到这个结果。如果您只希望
ActiveController
发生这种情况,您可能希望扩展
YourFile
模型,并仅在其中包含
fields()
方法,以便您可以使用扩展版本配置
ActiveController

我们还可以更改某些字段的显示名称:

class User extends \yii\db\ActiveRecord implements  \yii\web\IdentityInterface {    
/**     * API safe fields     */    
public function fields()    {

    return [            
        'id',            
        'email_address' => 'email',            
        'first_name',            
        'last_name',            
        'full_name' => function($model) {                
            return $model->getFullName();            
        },            
        'updated_at',            
        'created_at'        
    ];    
} 
}

请参见此处的完整教程:
我们还可以更改某些字段的显示名称:

class User extends \yii\db\ActiveRecord implements  \yii\web\IdentityInterface {    
/**     * API safe fields     */    
public function fields()    {

    return [            
        'id',            
        'email_address' => 'email',            
        'first_name',            
        'last_name',            
        'full_name' => function($model) {                
            return $model->getFullName();            
        },            
        'updated_at',            
        'created_at'        
    ];    
} 
}

请参见此处的完整教程:

覆盖操作是您案例中的解决方案,因为您要修改数据,也要在发送响应之前修改操作中的值。覆盖操作是您案例中的解决方案,因为您要在发送响应之前修改数据,也要修改操作中的值