没有不值得去解决的问题,也没有不值得去学习的技术!

在 Yii 2 中,更新模型时,当某字段不存在时,不更新模型(默认实现),当某字段存在,其值为空(赋值为属性的旧值)时,不更新模型的实现

PUT http://api.channel-pub-api.localhost/qq/v1/qq-cw-apps/148d4df6eba311e899f654ee75d2ebc1?group_id=spider 时,贵响应成功
1、GET http://api.channel-pub-api.localhost/qq/v1/qq-cw-apps/edit/148d4df6eba311e899f654ee75d2ebc1?group_id=spider ,响应如下,基于安全考虑,重置 Client Secret 为空字符串


{
    "code": 10000,
    "message": "编辑企鹅号的内容网站应用成功",
    "data": {
        "channel_app_source_uuid": "148d4df6eba311e899f654ee75d2ebc1",
        "penguin_name": "篮球场马达1",
        "penguin_login_qq": "3176058386",
        "penguin_login_wx": "",
        "client_id": "32deed1727f9a23a504d6dda48938de0",
        "client_secret": "",
        "permission": 2,
        "status": 0
    }
}


2、因此,PUT http://api.channel-pub-api.localhost/qq/v1/qq-cw-apps/148d4df6eba311e899f654ee75d2ebc1?group_id=spider 时,如果不更新 client_secret 的值,其值为空字符串 Body


{
	"penguin_name": "篮球场马达1",
	"penguin_login_qq": "3176058386",
	"penguin_login_wx": "",
	"client_id": "32deed1727f9a23a504d6dda48938de0",
	"client_secret": "",
	"permission": 2,
	"status": 0
}


3、请求响应失败,422,如图1
请求响应失败,422
图1


{
    "code": 20004,
    "message": "数据验证失败:Client Secret不能为空。"
}


4、现在需要实现 当 client_secret 的值为空字符串时,不对 client_secret 执行验证,且不更新 client_secret 的值,编辑验证规则


    /**
     * @inheritdoc
     */
    public function rules()
    {
        $rules = [
            /* 更新企鹅号的内容网站应用 */
            [['client_secret'], 'validateClientSecret', 'skipOnEmpty' => false, 'on' => self::SCENARIO_UPDATE],
            [['permission'], 'in', 'range' => [self::PERMISSION_SYNC, self::PERMISSION_PUB, self::PERMISSION_SYNC_PUB], 'on' => self::SCENARIO_UPDATE],
            [['status'], 'in', 'range' => [self::STATUS_DISABLED, self::STATUS_ENABLED], 'on' => self::SCENARIO_UPDATE],
        ];
        $parentRules = parent::rules();

        return ArrayHelper::merge($rules, $parentRules);
    }

    /**
     * Validates the Client Secret.
     * This method serves as the inline validation for Client Secret.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validateClientSecret($attribute, $params)
    {
        // 当 Client Secret 为空时,赋值 Client Secret 为原先的值
        if (empty($this->$attribute)) {
            $this->$attribute = $this->getOldAttribute($attribute);
        }
    }


5、PUT http://api.channel-pub-api.localhost/qq/v1/qq-cw-apps/148d4df6eba311e899f654ee75d2ebc1?group_id=spider 时,贵响应成功,如图2
PUT http://api.channel-pub-api.localhost/qq/v1/qq-cw-apps/148d4df6eba311e899f654ee75d2ebc1?group_id=spider 时,贵响应成功
图2
6、查看 SQL 语句,符合预期,当 client_secret 的值为空字符串时,未更新 client_secret 的值


UPDATE `cpa_qq_cw_app` SET `permission`=1, `updated_at`=1542610618 WHERE `id`=6


PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理