如何在Yii2中验证二维数组

时间:2018-04-19 10:42:49

标签: yii yii2 yii2-advanced-app

如何在Yii2中验证二维数组。

 passenger[0][name] = bell
 passenger[0][email] = myemail@test.com
 passenger[1][name] = carson123
 passenger[1][email] = carson##@test.com

如何验证此数组中的名称和电子邮件

由于

1 个答案:

答案 0 :(得分:1)

用于验证二维阵列的最干净的解决方案可能是将其视为模型阵列。因此,每个具有emailname数据集的数组都应单独验证。

class Passenger extends ActiveRecord {

    public function rules() {
        return [
            [['email', 'name'], 'required'],
            [['email'], 'email'],
        ];
    }
}

class PassengersForm extends Model {

    /**
     * @var Passenger[]
     */
    private $passengersModels = [];

    public function loadPassengersData($passengersData) {
        $this->passengersModels = [];
        foreach ($passengersData as $passengerData) {
            $model = new Passenger();
            $model->setAttributes($passengerData);
            $this->passengersModels[] = $model;
        }

        return !empty($this->passengers);
    }

    public function validatePassengers() {
        foreach ($this->passengersModels as $passenger) {
            if (!$passenger->validate()) {
                $this->addErrors($passenger->getErrors());
                return false;
            }
        }

        return true;
    }
}

在控制器中:

$model = new PassengersForm();
$model->loadPassengersData(\Yii::$app->request->post('passenger', []));
$isValid = $model->validatePassengers();

如果您仅将Passanger模型用于验证,也可以使用DynamicModel代替public function rules() { return [ [['passengers'], 'each', 'rule' => [PassengerDataValidator::class]], ]; } 模型。

或者你可以创建your own validator并将其用于数组的每个元素:

function isRepeating(str) {
  var characters = str.split('');
  if (characters.length < 2) { return false; }
  var characterCounts = characters.reduce(function(carry, char) {
      carry[char] = carry[char] ? carry[char] + 1 : 1;
      return carry;
  }, {});
  var counts = Object.values(characterCounts);
  return !counts.some(c => c !== counts[0]);
}

console.log(isRepeating("123a123a321a")); // true
console.log(isRepeating("hello"));        // false
console.log(isRepeating("racecar"));      // false
console.log(isRepeating("raceecar"));     // true

您可能还想阅读指南中的Collecting tabular input部分(不幸的是,它仍然不完整)。