{"record":{"id":"ca2ccbd96b1cff99","repo":"yiisoft/yii2","slug":"invalid-validation-rule-a-rule-must-specify-both","errorCode":null,"errorMessage":"Invalid validation rule: a rule must specify both attribute names and validator type.","messagePattern":"Invalid validation rule: a rule must specify both attribute names and validator type\\.","errorType":"exception","errorClass":"InvalidConfigException","httpStatus":null,"severity":"error","filePath":"framework/base/DynamicModel.php","lineNumber":234,"sourceCode":"     * @return static the model instance that contains the data being validated.\n     * @throws InvalidConfigException if a validation rule is not specified correctly.\n     */\n    public static function validateData(array $data, $rules = [])\n    {\n        /** @var static $model */\n        $model = new static($data);\n        if (!empty($rules)) {\n            $validators = $model->getValidators();\n            foreach ($rules as $rule) {\n                if ($rule instanceof Validator) {\n                    $validators->append($rule);\n                    $model->defineAttributesByValidator($rule);\n                } elseif (is_array($rule) && isset($rule[0], $rule[1])) { // attributes, validator type\n                    $validator = Validator::createValidator($rule[1], $model, (array)$rule[0], array_slice($rule, 2));\n                    $validators->append($validator);\n                    $model->defineAttributesByValidator($validator);\n                } else {\n                    throw new InvalidConfigException('Invalid validation rule: a rule must specify both attribute names and validator type.');\n                }\n            }\n        }\n\n        $model->validate();\n\n        return $model;\n    }\n\n    /**\n     * Define the attributes that applies to the specified Validator.\n     * @param Validator $validator the validator whose attributes are to be defined.\n     */\n    private function defineAttributesByValidator($validator)\n    {\n        foreach ($validator->getAttributeNames() as $attribute) {\n            if (!$this->hasAttribute($attribute)) {\n                $this->defineAttribute($attribute);","sourceCodeStart":216,"sourceCodeEnd":252,"githubUrl":"https://github.com/yiisoft/yii2/blob/66f00d18a29b520f85e8e8f1e32d1e7e7b556cac/framework/base/DynamicModel.php#L216-L252","documentation":"DynamicModel::validateData($data, $rules) accepts each rule either as a ready yii\\validators\\Validator instance or as an array where element 0 is the attribute list and element 1 the validator type (further elements are options). Any rule that is not an instance and lacks one of those two slots throws InvalidConfigException('Invalid validation rule: a rule must specify both attribute names and validator type.') before validation runs.","triggerScenarios":"A rule like ['email'] (attributes but no type) or a bare string 'required' instead of ['field', 'required']; rule arrays assembled dynamically where merges, shifts, or conditionals left a slot empty; copying only one column of a model's rules() table into a DynamicModel call.","commonSituations":"Ad-hoc validation of settings forms or API payloads; rules generated from configuration or database values; partial copy-paste of rule fragments.","solutions":["Normalize every rule to [[attributes], type, ...options] or a Validator instance before passing it","Validate the rules array before calling validateData: each element must be a Validator or an array with both isset($rule[0]) and isset($rule[1])","Unit-test the rules builder so malformed entries fail in CI instead of at request time"],"exampleFix":"// before - rule has attributes but no validator type\n$model = \\yii\\base\\DynamicModel::validateData($data, [\n    ['email'],\n]);\n\n// after\n$model = \\yii\\base\\DynamicModel::validateData($data, [\n    [['email'], 'email'],\n]);","handlingStrategy":"validation","validationCode":"use yii\\validators\\Validator;\nforeach ($rules as $rule) {\n    if (!$rule instanceof Validator && !(is_array($rule) && isset($rule[0], $rule[1]))) {\n        throw new \\InvalidArgumentException('Malformed validation rule: ' . var_export($rule, true));\n    }\n}\n$model = \\yii\\base\\DynamicModel::validateData($data, $rules);","typeGuard":null,"tryCatchPattern":"try {\n    $model = \\yii\\base\\DynamicModel::validateData($data, $rules);\n} catch (\\yii\\base\\InvalidConfigException $e) {\n    // message: Invalid validation rule: ...\n    Yii::error('Bad rules array: ' . print_r($rules, true));\n    throw $e;\n}","preventionTips":["Build rules only from a tested factory that guarantees the [attributes, type, ...options] shape","When rules come from config or DB, validate their structure before use","Never hand-write single-element rule arrays; always include the validator type"],"tags":["validation","dynamic-model","rules","configuration"],"backgroundTag":"invalid-validation-rule","analyzedSha":"66f00d18a29b520f85e8e8f1e32d1e7e7b556cac","analyzedAt":"2026-08-17T05:17:23.470Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}