https://www.yiichina.com/doc/guide/2.0/structure-models

场景

需要做一个手机号充值的功能,页面上有两个输入框,手机号码与充值的金额。

后端在接收前端传递的手机号与充值金额的时候,需要进行一些格式的判断,比如

  1. <?php
  2. if (empty($_POST['mobile'])){
  3. throw new Exception('请输入手机号码');
  4. }
  5. if (手机号是否合法) ...
  6. if (金额是否存在) ...
  7. if (金额是否合法) ...

很多的if else的判断,看上去很是不优雅,那么如何在yii中是如何使用model进行避免的呢?

与model(ActiveRecord)的区别

ActiveRecord 是属于ORM,其与数据库表相对应。
而此 Model,也可以称之为Form,是一种数据结构化,接收来自前台、接口的一种数据集合体。

使用model

自定义model

  1. <?php
  2. namespace app\models;
  3. use app\base\Model;
  4. class RechargeModel extends Model
  5. {
  6. public $mobile;
  7. public $account;
  8. public function rules ()
  9. {
  10. $rules = [];
  11. $rules[] = [
  12. [
  13. 'mobile',
  14. 'account'
  15. ],
  16. 'required'
  17. ];
  18. $rules[] = [
  19. 'mobile',
  20. 'checkMobile'
  21. ];
  22. $rules[] = [
  23. 'account',
  24. 'integer',
  25. 'min' => 0
  26. ];
  27. return $rules;
  28. }
  29. public function attributeLabels ()
  30. {
  31. return [
  32. 'mobile' => '手机号',
  33. 'account' => '充值金额'
  34. ];
  35. }
  36. // 自定义校验规则
  37. public function checkMobile ($model, $attribute)
  38. {
  39. // 此处写手机号的校验规则,如果校验失败,则addError进行错误提示
  40. if(手机号不合法)
  41. {
  42. $this->addError($attribute, '手机号格式不正确');
  43. }
  44. }
  45. }

简单使用

  1. <?php
  2. // 模拟
  3. $model = new RechargeModel();
  4. $model->mobile = 1;
  5. $model->account = -1;
  6. var_dump($model->validate(), $model->errors);
  7. die;
  8. // 正常
  9. $model = new RechargeModel();
  10. // load的第二个参数如果不是 '',那么前端上传的字段需要为 RechargeModel[mobile] 和 RechargeModel[account]
  11. if ($model->load(Yii::$app->request->post(), '') && $model->validate()){
  12. // 验证成功
  13. // do something
  14. return;
  15. }
  16. // 验证失败
  17. var_dump($model->errors);