Model::rules() return annotation incorrectly restricts array keys to integers
Author: jrajamakiCreated Sep 7, 2026Updated Sep 7, 2026
Description
The @return annotation added in #20764 declares:
/**
* @return array<int, array<array-key, mixed>|Validator> validation rules
*/
public function rules()This incorrectly restricts the outer array keys to integers. Yii processes rules using foreach, so associative keys are valid as long as the values contain valid rule definitions.
For example:
class ExampleModel extends \yii\base\Model
{
public function rules()
{
return [
'search' => [
['name', 'email'],
'safe',
],
];
}
}This is accepted by Yii because the key is ignored when validators are created.
The current annotation causes static-analysis errors for valid code:
$rules = parent::rules();
$searchRules = $rules['search'];
unset($rules['search']);PHPStan reports:
Cannot unset offset 'search' on array<int, array<mixed>|yii\validators\Validator>The return type should allow any valid PHP array key:
/**
* @return array<array-key, array<array-key, mixed>|Validator> validation rules
*/Alternatively, if Yii intends to guarantee integer keys, the implementation and documentation should explicitly reject associative keys. Since Yii currently ignores rule keys during iteration, allowing array-key appears to match the actual behavior and existing usage.
Source: yiisoft/yii2