2017-02-07 8 views
0

Правила в моделях Yii2 выглядеть следующим образом:Почему Yii2 использует массивы для правил вместо объектов?

[ 
    // checks if "level" is 1, 2 or 3 
    ['level', 'in', 'range' => [1, 2, 3]], 
] 

Не было бы лучше, если бы они были объектами, как это?

[ 
    new RangeRule('level', [1, 2, 3]) 
] 
+1

Для оптимизации производительности I Угадай. – Bizley

+0

AFAIK, разница в производительности очень мала между массивами и объектами. –

+0

См. Http://stackoverflow.com/questions/2193049/php-objects-vs-arrays и https://gist.github.com/Thinkscape/1136563. PHP улучшает оптимизацию массива с каждой версией. – Bizley

ответ

1

Вы можете использовать валидаторы объекты, как это:

use yii\validators\Validator; 
use yii\validators\NumberValidator; 
use yii\validators\StringValidator; 

class TestModel extends \yii\base\Model 
{ 
    public $firstProperty; 
    public $secondProperty; 

    public function rules() 
    { 
     return [ 
      new NumberValidator(['attributes' => ['firstProperty'], 'integerOnly' => true, 'min' => 0, 'max' => 100]), 
      new StringValidator(['attributes' => ['secondProperty'], 'max' => 5]), 
     ]; 
    } 
} 

Кроме того, вы можете украсить эти объекты, как вы хотите (с помощью дополнительных классов и методов):

class TestModel extends \yii\base\Model 
{ 
    public $firstProperty; 
    public $secondProperty; 

    public function rules() 
    { 
     // Prepare Int validator 
     $validatorInt    = new NumberValidator(); 
     $validatorInt->integerOnly = true; 
     $validatorInt->min   = 0; 
     $validatorInt->max   = 100; 

     // Prepare String validator 
     $validatorString  = new StringValidator(); 
     $validatorString->max = 5; 

     // Make rules 
     return [ 
      static::_makeRule(['firstProperty'], $validatorInt), 
      static::_makeRule(['secondProperty'], $validatorString), 
     ]; 
    } 

    protected function _makeRule($attrName, Validator $validatorObj) 
    { 
     $validatorObj = clone $validatorObj; 

     $validatorObj->attributes = (array)$attrName; 

     $validatorObj->init();       // Initializes validator and normalizes values 

     return $validatorObj; 
    } 

} 
Смежные вопросы