【问题标题】:Why is Yii2 using arrays for rules instead of objects?为什么 Yii2 使用数组而不是对象作为规则?
【发布时间】:2017-06-24 17:59:16
【问题描述】:

Yii2 模型中的规则如下所示:

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

如果它们是这样的对象不是更好吗?

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

【问题讨论】:

  • 我猜是为了性能优化。
  • AFAIK,数组和对象之间的性能差异非常小。
  • 请参阅 stackoverflow.com/questions/2193049/php-objects-vs-arraysgist.github.com/Thinkscape/1136563 - PHP 在每个版本的数组优化方面都越来越好。
  • 那些基准仍然很旧。我认为需要一个用于 PHP 7 的版本。
  • 加载类文件只进行一次。我认为数组使规则更难阅读,但如果可以使用对象来代替,那么没问题。

标签: validation yii2 models rules


【解决方案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;
    }

}

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2011-10-06
    • 1970-01-01
    • 2020-08-10
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多