Yii2 前端请求的参数字段映射数据模型的属性

发布于 2024-10-27 10:50:27 字数 1724 浏览 8 评论 0

使用 Yii 2 构建 RESTFul API 项目时,需要实现一个功能。这个功能可以将 HTTP 请求的参数和后端数据模型相映射,让前端的请求参数命名和后端数据的模型属性不需要保持一致,并在指定场景中实现数据验证。实现代码如下:

<?php
/*
 * 前端传递 JSON 数据进来,格式是{"name":"admin","pwd":"123456"}
 * 需要对数据在指定场景下验证,并对应到模型的 username 属性和 password_hash 属性
 */

// 模型代码
class SignInForm
{
  public $name;
  public $pwd;

  public function rules()
  {
    $rules = [
      [
        [
          'name',
          'pwd',
        ],
        'required',
        'on' => 'signIn',
      ],
      [
        ['name'],
        'default',
        'value' => $this->username,
        'on' => 'signIn',
      ],
      [
        ['pwd'],
        'default',
        'value' => $this->password_hash,
        'on' => 'signIn',
      ],
    ];

    return $rules;
  }
}

// 控制器代码
<?php

use Yii;
use workerbee\api\controllers\BaseController;

class UserController extends BaseController
{
public function actionSignIn()
  {
    $data['SignInForm'] = Yii::$app->request->post();
    $signInModel = new SignInForm(['scenario' => 'signIn']);

    if ($signInModel->load($data) && $signInModel->validate()) {
      $user = SignInForm::findByUsername($signInModel->username);
      $validator = Yii::$app->getSecurity()->validatePassword($signInModel->pwd, $user->password_hash);
      if ($user !== null && $validator) {
        $user->access_token = $signInModel->getNewAccessToken();
        if ($user->save()) {
          return $user;
        }

        throw new ServerErrorHttpException('登陆失败.');
      }

      throw new BadRequestHttpException('账号名或密码错误.');
    }

    throw new UnprocessableEntityHttpException('数据验证失败.');
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

病毒体

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文