Yii-ad-hoc-validation

提供:Dev Guides
移動先:案内検索

Yii-アドホック検証

モデルにバインドされていない値を検証する必要がある場合があります。 yii \ base \ DynamicModel クラスを使用できます。このクラスは、属性とルールの両方をオンザフライで定義することをサポートします。

ステップ1 *- *actionAdHocValidation メソッドを SiteController に追加します。

public function actionAdHocValidation() {
   $model = DynamicModel::validateData([
      'username' => 'John',
      'email' => '[email protected]'
   ], [
      [[username', 'email'], 'string', 'max' => 12],
      ['email', 'email'],
   ]);

   if ($model->hasErrors()) {
      var_dump($model->errors);
   } else {
      echo "success";
   }
}

上記のコードでは、ユーザー名と電子メールの属性で*「動的」*モデルを定義し、それらを検証します。

ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/ad-hoc-validation と入力すると、メールが14文字であるためエラーメッセージが表示されます。長いです。

14文字の長さ

カスタム検証

カスタムバリデータには2種類あります-

  • インラインバリデーター
  • スタンドアロンのバリデーター
    インラインバリデータは、モデルメソッドまたは匿名関数によって定義されます。 属性が検証に失敗した場合、* yii \ base \ Model
    addError()*メソッドを呼び出してエラーメッセージを保存する必要があります。

次の RegistrationForm の例は、cityプロパティを検証するため、ロンドンとパリの2つの値のみを受け入れることができます。

<?php
   namespace app\models;
   use Yii;
   use yii\base\Model;
   class RegistrationForm extends Model {
      public $username;
      public $password;
      public $email;
      public $country;
      public $city;
      public $phone;
      public function rules() {
         return [
            ['city', 'validateCity']
         ];
      }
      public function validateCity($attribute, $params) {
         if (!in_array($this->$attribute, ['Paris', 'London'])) {
            $this->addError($attribute, 'The city must be either "London" or "Paris".');
         }
      }
   }
?>
スタンドアロンのバリデーターは yii \ validators \ Validator クラスを拡張します。 検証ロジックを実装するには、* yii \ validators \ Validator
validateAttribute()*メソッドをオーバーライドする必要があります。

ステップ1 *-スタンドアロンのバリデータを使用して前の例を実装するには、 *CityValidator.php ファイルを components フォルダーに追加します。

<?php
   namespace app\components;
   use yii\validators\Validator;
   class CityValidator extends Validator {
      public function validateAttribute($model, $attribute) {
         if (!in_array($model->$attribute, ['Paris', 'London'])) {
            $this->addError($model, $attribute, 'The city must be either "Paris"
               or "London".');
         }
      }
   }
?>

ステップ2 *-次に、 *RegistrationForm モデルをこの方法で変更します。

<?php
   namespace app\models;
   use app\components\CityValidator;
   use Yii;
   use yii\base\Model;
   class RegistrationForm extends Model {
      public $username;
      public $password;
      public $email;
      public $country;
      public $city;
      public $phone;
      public function rules() {
         return [
            ['city', CityValidator::className()]
         ];
      }
   }
?>