如何在 Yii2 中验证二维数组

How to validate two dimensional array in Yii2

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

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

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

谢谢

验证二维数组的最简洁的解决方案可能是将其视为模型数组。因此,每个包含 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();

如果您仅将模型用于验证,您也可以使用 DynamicModel 而不是创建 Passanger 模型。


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

public function rules() {
    return [
        [['passengers'], 'each', 'rule' => [PassengerDataValidator::class]],
    ];
}

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