Class yii\behaviors\OptimisticLockBehavior

继承yii\behaviors\OptimisticLockBehavior » yii\behaviors\AttributeBehavior » yii\base\Behavior » yii\base\BaseObject
实现yii\base\Configurable
可用自版本2.0.16
源代码 https://github.com/yiisoft/yii2/blob/master/framework/behaviors/OptimisticLockBehavior.php

OptimisticLockBehavior 使用 optimisticLock() 返回的列名自动升级模型的锁定版本.

乐观锁允许多个用户访问相同的记录以进行编辑, 以避免潜在的冲突.

如果用户尝试将记录保存在某些已故数据中(因为另一个用户已修改了数据), 则会抛出 StaleObjectException 异常, 并跳过更新或删除.

要使用此行为, 请首先按照 optimisticLock() 中列出的步骤启用乐观锁, 从 ActiveRecord 类的 rules() 方法中删除包含锁定版本的列名称, 然后将以下代码添加到其中:

use yii\behaviors\OptimisticLockBehavior;

public function behaviors()
{
    return [
        OptimisticLockBehavior::className(),
    ];
}

默认情况下, OptimisticLockBehavior 将使用 getBodyParam() 来解析提交的值, 或者在任何失败时将其设置为0. 这意味者不保存版本属性的请求可以实现对尸体的第一次成功更新, 但是从那里开始任何进一步的尝试都应该失败, 除非请求持有预期的版本号.

一旦附加, 如果版本号不被 getBodyParam() 保存, 模型类的内部使用也应该无法保存记录. 扩展模型类, 通过重写 optimisticLock() 在子类中启用乐观锁可能很有用, 然后将行为附加到子类, 这样你就可以将父模型绑定到内部使用, 同时将保持此行为的子模型链接到负责接收最终用户输入的控制器. 或者, 你也可以使用 PHP 回调配置 $value 属性以实现不同的逻辑.

OptimisticLockBehavior 还提供了一个名为 upgrade() 的方法, 它将模型的版本增加一个, 当你需要在连接的客户端中将实体标记为已故时, 这可能很有用, 并且在他们再次加载之前避免对其进行任何更改:

$model->upgrade();

参见 yii\db\BaseActiveRecord::optimisticLock() 有关如何启用乐观锁的详细信息.

公共属性

隐藏继承的属性

属性类型描述定义在
$attributes array 要通过 $value 指定的值自动填充的属性列表. yii\behaviors\AttributeBehavior
$owner yii\base\Component|null 该行为的所有者. yii\base\Behavior
$preserveNonEmptyValues boolean 是否保留非空属性值. yii\behaviors\AttributeBehavior
$skipUpdateOnClean boolean 是否在未修改$owner没有时跳过此行为. yii\behaviors\OptimisticLockBehavior
$value mixed 将分配给当前属性的值. yii\behaviors\OptimisticLockBehavior

公共方法

隐藏继承的方法

方法描述定义在
__call() 调用不是类方法的已命名方法. yii\base\BaseObject
__construct() 构造函数. yii\base\BaseObject
__get() 返回对象属性的值. yii\base\BaseObject
__isset() 检查属性是否已设置, 即已定义且不为null. yii\base\BaseObject
__set() 设置对象属性的值. yii\base\BaseObject
__unset() 将对象属性设置为null. yii\base\BaseObject
attach() 将行为对象附加到组件. yii\behaviors\OptimisticLockBehavior
canGetProperty() 返回一个值, 指示属性是否可读. yii\base\BaseObject
canSetProperty() 返回一个值, 指示属性是否可写. yii\base\BaseObject
className() 返回此类的完全限定名称. yii\base\BaseObject
detach() 从组件中分离行为对象. yii\base\Behavior
evaluateAttributes() 计算属性值并将其分配给当前属性. yii\behaviors\AttributeBehavior
events() 声明 所有者 事件的事件处理程序. yii\behaviors\OptimisticLockBehavior
hasMethod() 返回一个值, 指示方法是否已定义. yii\base\BaseObject
hasProperty() 返回一个值, 指示属性是否已定义. yii\base\BaseObject
init() 初始化对象. yii\base\BaseObject
upgrade() 将版本值升级为1并将其存储到数据库. yii\behaviors\OptimisticLockBehavior

受保护的方法

隐藏继承的方法

方法描述定义在
getLockAttribute() 返回列名以保存 optimisticLock() 中定义的版本值. yii\behaviors\OptimisticLockBehavior
getValue() 返回当前属性的值. yii\behaviors\OptimisticLockBehavior

属性详情

$skipUpdateOnClean public 属性 (可用自版本: 2.0.8)

是否在未修改$owner没有时跳过此行为.

public boolean $skipUpdateOnClean false
$value public 属性

null的情况下, 它将直接从 getBodyParam() 中解析值或将其设置为0.

将分配给当前属性的值.

这可以是一个匿名函数, 可以以数组格式调用(eg. [$this, 'methodName']), 一个表示数据库(DB)表达式的 Expression 对象(eg. new Expression('NOW()')), 标量, 字符串或任意值. 如果是前者, 则将函数的返回值分配给属性.

函数的签名应该如下:

function ($event)
{
    // 返回值将分配给该属性
}
public mixed $value null

方法详情

attach() public 方法

将行为对象附加到组件.

默认实现将设置 所有者 属性并附加在 事件 中声明的事件处理程序. 如果重写此方法, 请确保调用父实现.

public void attach ( $owner )
$owner yii\base\Component

要将此行为附加到的组件..

events() public 方法

声明 所有者 事件的事件处理程序.

子类可以重写此方法来声明应将哪些 PHP 回调应附加到 所有者 组件的事件.

当行为附加到所有者时, 回调将附加到 所有者 的事件中; 当行为与组件分离时, 它们将与事件分离.

回调可以是以下任何一种:

  • 此行为中的方法: 'handleClick', 相当于[$this, 'handleClick']
  • 对象方法: [$object, 'handleClick']
  • 静态方法: ['Page', 'handleClick']
  • 匿名函数: function ($event) { ... }

以下是一个例子:

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

事件(数组键)和相应的事件处理程序方法(数组值).

getLockAttribute() protected 方法 (可用自版本: 2.0.16)

返回列名以保存 optimisticLock() 中定义的版本值.

protected string getLockAttribute ( )
return string

属性值.

throws yii\base\InvalidCallException

如果没有正确配置 optimisticLock().

getValue() protected 方法

返回当前属性的值.

null的情况下, 将从 getBodyParam() 中解析值或将其设置为0.

该方法由 evaluateAttributes() 调用. 其返回值将被分配给与触发事件相对应的属性.

protected mixed getValue ( $event )
$event yii\base\Event

触发当前属性更新的事件.

return mixed

属性的值.

upgrade() public 方法 (可用自版本: 2.0.16)

将版本值升级为1并将其存储到数据库.

$model->upgrade();
public void upgrade ( )
throws yii\base\InvalidCallException

如果所有者是新记录.