条件校验器

有些情况下,需要启用或者禁用模型的指定验证规则。Yii2提供了一个机制来帮你做到这一点。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。

如何做…

  1. 创建一个表单文件@app/models/DeliveryForm.php
  1. <?php
  2. namespace app\models;
  3. use app\components\WordsValidator;
  4. use yii\base\Model;
  5. class DeliveryForm extends Model
  6. {
  7. const TYPE_PICKUP = 1;
  8. const TYPE_COURIER = 2;
  9. public $type;
  10. public $address;
  11. public function rules()
  12. {
  13. return [
  14. ['type', 'required'],
  15. ['type', 'in', 'range'=>[self::TYPE_PICKUP, self::TYPE_COURIER]],
  16. ['address', 'required', 'when' => function ($model)
  17. {
  18. return $model->type == self::TYPE_COURIER;
  19. }, 'whenClient' => "function (attribute, value) {return $('#deliveryform-type').val()=='".self::TYPE_COURIER."';}"]
  20. ];
  21. }
  22. public function typeList()
  23. {
  24. return [
  25. self::TYPE_PICKUP => 'Pickup',
  26. self::TYPE_COURIER => 'Courier delivery',
  27. ];
  28. }
  29. }
  1. 创建一个控制器文件@app/controllers/ValidationController.php
  1. <?php
  2. namespace app\controllers;
  3. use Yii;
  4. use yii\web\Controller;
  5. use app\models\DeliveryForm;
  6. class ValidationController extends Controller
  7. {
  8. public function actionIndex()
  9. {
  10. $model = new DeliveryForm();
  11. if ($model->load(Yii::$app->request->post()) && $model->validate()) {
  12. Yii::$app->session->setFlash('success',
  13. 'The form was successfully processed!'
  14. );
  15. }
  16. return $this->render('index', array(
  17. 'model' => $model,
  18. ));
  19. }
  20. }
  1. 创建一个视图文件@app/views/validation/index.php
  1. <?php
  2. use yii\bootstrap\ActiveForm;
  3. use yii\helpers\Html;
  4. ?>
  5. <h1>Delivery form</h1>
  6. <?php if (Yii::$app->session->hasFlash('success')): ?>
  7. <div class="alert alert-success"><?= Yii::$app->session->getFlash('success'); ?></div>
  8. <?php endif; ?>
  9. <?php $form = ActiveForm::begin(); ?>
  10. <?= $form->field($model, 'type')->dropDownList($model->typeList(), ['prompt'=>'Select delivery type']) ?>
  11. <?= $form->field($model, 'address') ?>
  12. <div class="form-group">
  13. <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
  14. </div>
  15. <?php ActiveForm::end(); ?>
  1. 运行validation控制器index.php?r=validation,选择courier delivery:

条件校验器 - 图1

工作原理…

type属性被设置为DeliveryForm::TYPE_COURIER时,DeliveryForm address属性是必需的;否则是可选的。

此外,为了支持客户端条件验证,我们配置了whenClient属性,它使用了一个Javascript函数来决定是否应用这个规则。

参考

欲了解更多信息,参考http://www.yiiframework.com/doc-2.0/guideinputvalidation.html#conditional-validation