没有命名空间的类 yii yii\base yii\behaviors yii\caching yii\captcha yii\console yii\console\controllers yii\console\widgets yii\data yii\db yii\db\conditions yii\db\cubrid yii\db\cubrid\conditions yii\db\mssql yii\db\mssql\conditions yii\db\mysql yii\db\oci yii\db\oci\conditions yii\db\pgsql yii\db\sqlite yii\db\sqlite\conditions yii\di yii\filters yii\filters\auth yii\grid yii\helpers yii\i18n yii\log yii\mail yii\mutex yii\rbac yii\rest yii\test yii\validators yii\web yii\widgets

Class yii\behaviors\AttributesBehavior

继承yii\behaviors\AttributesBehavior » yii\base\Behavior » yii\base\BaseObject
实现yii\base\Configurable
可用版本自2.0.13
源码 https://github.com/yiichina/yii2/blob/api/framework/behaviors/AttributesBehavior.php

AttributesBehavior 是在某个事件发生的时候, 用来给 ActiveRecord 对象的一个或多个属性自动设置指定值的行为。

要使用 AttributesBehavior,就要配置 $attributes 属性,它指明了需要更新的属性列表和 触发这个更新操作对应的事件。然后再配置短数组的值为一个 PHP 匿名函数, 该函数应该返回设置给当前属性的值。 比如,

use yii\behaviors\AttributesBehavior;

public function behaviors()
{
    return [
        [
            'class' => AttributesBehavior::className(),
            'attributes' => [
                'attribute1' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => new Expression('NOW()'),
                    ActiveRecord::EVENT_BEFORE_UPDATE => \Yii::$app->formatter->asDatetime('2017-07-13'),
                ],
                'attribute2' => [
                    ActiveRecord::EVENT_BEFORE_VALIDATE => [$this, 'storeAttributes'],
                    ActiveRecord::EVENT_AFTER_VALIDATE => [$this, 'restoreAttributes'],
                ],
                'attribute3' => [
                    ActiveRecord::EVENT_BEFORE_VALIDATE => $fn2 = [$this, 'getAttribute2'],
                    ActiveRecord::EVENT_AFTER_VALIDATE => $fn2,
                ],
                'attribute4' => [
                    ActiveRecord::EVENT_BEFORE_DELETE => function ($event, $attribute) {
                        static::disabled() || $event->isValid = false;
                    },
                ],
            ],
        ],
    ];
}

由于属性值会被这个行为自动设置,所以属性值不必用户输入也因此没有必要验证。 因此,这些属性不应该出现在 rules() 这个模型方法中。

公共属性

隐藏继承的属性

属性类型描述被定义在
$attributes array 指出将被自动更新的属性列表,而被更新的值通过短数组给出。 数组的键就是更新于事件之上的 ActiveRecord 对象的属性, 而数组的值则是对应事件的短数组。对这样的短数组而言: 数组的键就是 ActiveRecord 事件,属性就是根据这些事件更新的, 数组的值则是要设置给当前属性的值。数组的值可以是一个匿名函数, 数组格式的回调方法(比如 [$this, 'methodName']),一个表示 DB 表达式的 Expression 对象 (比如 new Expression('NOW()')),标量,字符串或者一个任意的值。如果是前者, 那么函数的返回值将设置给这个属性 `php [ 'attribute1' => [ ActiveRecord::EVENT_BEFORE_INSERT => new Expression('NOW()'), ActiveRecord::EVENT_BEFORE_UPDATE => \Yii::$app->formatter->asDatetime('2017-07-13'), ], 'attribute2' => [ ActiveRecord::EVENT_BEFORE_VALIDATE => [$this, 'storeAttributes'], ActiveRecord::EVENT_AFTER_VALIDATE => [$this, 'restoreAttributes'], ], 'attribute3' => [ ActiveRecord::EVENT_BEFORE_VALIDATE => $fn2 = [$this, 'getAttribute2'], ActiveRecord::EVENT_AFTER_VALIDATE => $fn2, ], 'attribute4' => [ ActiveRecord::EVENT_BEFORE_DELETE => function ($event, $attribute) { static::disabled() || $event->isValid = false; }, ], ] ` yii\behaviors\AttributesBehavior
$order array 用事件给出将被更新的属性的顺序列表。 数组的键就是属性据此完成更新的 ActiveRecord 事件, 而数组的值则是对应属性的顺序。 不在这些数组里的属性将会在最后处理。 如果 $attributes 里的属性没有指明事件,那么这些属性会被忽略不被更新。 `php [ ActiveRecord::EVENT_BEFORE_VALIDATE => ['attribute1', 'attribute2'], ActiveRecord::EVENT_AFTER_VALIDATE => ['attribute2', 'attribute1'], ] ` yii\behaviors\AttributesBehavior
$owner yii\base\Component|null The owner of this behavior yii\base\Behavior
$preserveNonEmptyValues boolean 是否保留非空的值不更新。 yii\behaviors\AttributesBehavior
$skipUpdateOnClean boolean $owner 没被更新时是否跳过该行为。 yii\behaviors\AttributesBehavior

公共方法

隐藏继承的方法

方法描述被定义在
__call() Calls the named method which is not a class method. yii\base\BaseObject
__construct() Constructor. yii\base\BaseObject
__get() Returns the value of an object property. yii\base\BaseObject
__isset() Checks if a property is set, i.e. defined and not null. yii\base\BaseObject
__set() Sets value of an object property. yii\base\BaseObject
__unset() Sets an object property to null. yii\base\BaseObject
attach() Attaches the behavior object to the component. yii\base\Behavior
canGetProperty() Returns a value indicating whether a property can be read. yii\base\BaseObject
canSetProperty() Returns a value indicating whether a property can be set. yii\base\BaseObject
className() Returns the fully qualified name of this class. yii\base\BaseObject
detach() Detaches the behavior object from the component. yii\base\Behavior
evaluateAttributes() 解析属性的值并更新到当前属性上。 yii\behaviors\AttributesBehavior
events() Declares event handlers for the $owner's events. yii\behaviors\AttributesBehavior
hasMethod() Returns a value indicating whether a method is defined. yii\base\BaseObject
hasProperty() Returns a value indicating whether a property is defined. yii\base\BaseObject
init() Initializes the object. yii\base\BaseObject

受保护的方法

隐藏继承的方法

方法描述被定义在
getValue() 返回当前属性的值。 该方法是由 evaluateAttributes() 内部调用的。 它的返回值将会根据触发的事件设置到目标属性上。 yii\behaviors\AttributesBehavior

属性详情

$attributes 公共 属性

指出将被自动更新的属性列表,而被更新的值通过短数组给出。 数组的键就是更新于事件之上的 ActiveRecord 对象的属性, 而数组的值则是对应事件的短数组。对这样的短数组而言: 数组的键就是 ActiveRecord 事件,属性就是根据这些事件更新的, 数组的值则是要设置给当前属性的值。数组的值可以是一个匿名函数, 数组格式的回调方法(比如 [$this, 'methodName']),一个表示 DB 表达式的 Expression 对象 (比如 new Expression('NOW()')),标量,字符串或者一个任意的值。如果是前者, 那么函数的返回值将设置给这个属性

[
  'attribute1' => [
      ActiveRecord::EVENT_BEFORE_INSERT => new Expression('NOW()'),
      ActiveRecord::EVENT_BEFORE_UPDATE => \Yii::$app->formatter->asDatetime('2017-07-13'),
  ],
  'attribute2' => [
      ActiveRecord::EVENT_BEFORE_VALIDATE => [$this, 'storeAttributes'],
      ActiveRecord::EVENT_AFTER_VALIDATE => [$this, 'restoreAttributes'],
  ],
  'attribute3' => [
      ActiveRecord::EVENT_BEFORE_VALIDATE => $fn2 = [$this, 'getAttribute2'],
      ActiveRecord::EVENT_AFTER_VALIDATE => $fn2,
  ],
  'attribute4' => [
      ActiveRecord::EVENT_BEFORE_DELETE => function ($event, $attribute) {
          static::disabled() || $event->isValid = false;
      },
  ],
]
public array $attributes = []
$order 公共 属性

用事件给出将被更新的属性的顺序列表。 数组的键就是属性据此完成更新的 ActiveRecord 事件, 而数组的值则是对应属性的顺序。 不在这些数组里的属性将会在最后处理。 如果 $attributes 里的属性没有指明事件,那么这些属性会被忽略不被更新。

[
    ActiveRecord::EVENT_BEFORE_VALIDATE => ['attribute1', 'attribute2'],
    ActiveRecord::EVENT_AFTER_VALIDATE => ['attribute2', 'attribute1'],
]
public array $order = []
$preserveNonEmptyValues 公共 属性

是否保留非空的值不更新。

$skipUpdateOnClean 公共 属性

$owner 没被更新时是否跳过该行为。

方法详情

evaluateAttributes() 公共 方法

解析属性的值并更新到当前属性上。

public void evaluateAttributes($event)
$event yii\base\Event
events() 公共 方法

Declares event handlers for the $owner's events.

Child classes may override this method to declare what PHP callbacks should be attached to the events of the $owner component.

The callbacks will be attached to the $owner's events when the behavior is attached to the owner; and they will be detached from the events when the behavior is detached from the component.

The callbacks can be any of the following:

  • method in this behavior: 'handleClick', equivalent to [$this, 'handleClick']
  • object method: [$object, 'handleClick']
  • static method: ['Page', 'handleClick']
  • anonymous function: function ($event) { ... }

The following is an example:

[
    Model::EVENT_BEFORE_VALIDATE => 'myBeforeValidate',
    Model::EVENT_AFTER_VALIDATE => 'myAfterValidate',
]
public array events()
return array

Events (array keys) and the corresponding event handler methods (array values).

getValue() 受保护 方法

返回当前属性的值。 该方法是由 evaluateAttributes() 内部调用的。 它的返回值将会根据触发的事件设置到目标属性上。

protected mixed getValue($attribute, $event)
$attribute string

目标属性名

$event yii\base\Event

触发当前属性开始更新动作的事件

return mixed

属性值