0 关注者

类 yii\behaviors\SluggableBehavior

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

SluggableBehavior 会自动填充指定属性,该属性值可用于 URL 中的 Slug。

注意:此行为依赖于 php-intl 扩展进行转写。如果未安装,则回退到 yii\helpers\Inflector::$transliteration 中定义的替换。

若要使用 SluggableBehavior,请将以下代码插入您的 ActiveRecord 类

use yii\behaviors\SluggableBehavior;

public function behaviors()
{
    return [
        [
            'class' => SluggableBehavior::class,
            'attribute' => 'title',
            // 'slugAttribute' => 'slug',
        ],
    ];
}

默认情况下,当关联的 AR 对象被验证时,SluggableBehavior 会用可用于 URL 中的 Slug 值填充 slug 属性。

由于属性值将由此行为自动设置,因此它们通常不是用户输入,因此不应该被验证,即 slug 属性不应该出现在模型的 rules() 方法中。

如果您的属性名称不同,您可以像下面这样配置 $slugAttribute 属性

public function behaviors()
{
    return [
        [
            'class' => SluggableBehavior::class,
            'slugAttribute' => 'alias',
        ],
    ];
}

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$attribute string|array|null 将被转换为 Slug 的属性或属性列表,或 null,表示将使用 $value 属性来生成 Slug。 yii\behaviors\SluggableBehavior
$attributes array 要使用 $value 指定的值自动填充的属性列表。 yii\behaviors\AttributeBehavior
$ensureUnique boolean 是否确保生成的 Slug 值在所有者类记录中是唯一的。 yii\behaviors\SluggableBehavior
$immutable boolean 如果 Slug 之前已生成,是否生成一个新的 Slug。 yii\behaviors\SluggableBehavior
$owner yii\base\Component|null 此行为的所有者 yii\base\Behavior
$preserveNonEmptyValues boolean 是否保留非空属性值。 yii\behaviors\AttributeBehavior
$skipOnEmpty boolean 如果 $attribute 为空或空字符串,是否跳过 Slug 生成。 yii\behaviors\SluggableBehavior
$skipUpdateOnClean boolean 如果 $owner 未被修改,是否跳过此行为。 yii\behaviors\AttributeBehavior
$slugAttribute string 将接收 Slug 值的属性 yii\behaviors\SluggableBehavior
$uniqueSlugGenerator callable|null Slug 唯一值生成器。 yii\behaviors\SluggableBehavior
$uniqueValidator array Slug 唯一性验证器的配置。 yii\behaviors\SluggableBehavior
$value callable|string|null 将用作 Slug 的值。 yii\behaviors\SluggableBehavior

公共方法

隐藏继承的方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\BaseObject
__construct() 构造函数。 yii\base\BaseObject
__get() 返回对象属性的值。 yii\base\BaseObject
__isset() 检查属性是否已设置,即已定义且不为空。 yii\base\BaseObject
__set() 设置对象属性的值。 yii\base\BaseObject
__unset() 将对象属性设置为 null。 yii\base\BaseObject
attach() 将行为对象附加到组件。 yii\base\Behavior
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\BaseObject
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\BaseObject
className() 返回此类的完全限定名。 yii\base\BaseObject
detach() 从组件中分离行为对象。 yii\base\Behavior
evaluateAttributes() 评估属性值并将其分配给当前属性。 yii\behaviors\AttributeBehavior
events() $owner 的事件声明事件处理程序。 yii\behaviors\AttributeBehavior
hasMethod() 返回一个值,指示是否定义了方法。 yii\base\BaseObject
hasProperty() 返回一个值,指示是否定义了属性。 yii\base\BaseObject
init() 初始化对象。 yii\behaviors\SluggableBehavior

受保护的方法

隐藏继承的方法

方法 描述 定义于
generateSlug() 此方法由 getValue() 调用以生成 Slug。 yii\behaviors\SluggableBehavior
generateUniqueSlug() 使用配置的回调或迭代增量来生成 Slug。 yii\behaviors\SluggableBehavior
getValue() 返回当前属性的值。 yii\behaviors\SluggableBehavior
isEmpty() 检查 $slugPart 是否为空字符串或 null。 yii\behaviors\SluggableBehavior
isNewSlugNeeded() 检查是否需要生成新的 Slug。此方法由 getValue() 调用以检查是否需要生成新的 Slug。 yii\behaviors\SluggableBehavior
makeUnique() $ensureUnique 为 true 时,此方法由 getValue() 调用以生成唯一的 Slug。 yii\behaviors\SluggableBehavior
validateSlug() 检查给定的 Slug 值是否唯一。 yii\behaviors\SluggableBehavior

属性详细信息

隐藏继承的属性

$attribute 公共属性

将被转换为 Slug 的属性或属性列表,或 null,表示将使用 $value 属性来生成 Slug。

public string|array|null $attribute null
$ensureUnique 公共属性

是否确保生成的 slug 值在所有者类记录中是唯一的。如果启用,则该行为将自动验证 slug 的唯一性。如果验证失败,它将尝试从基础 slug 生成唯一的 slug 值,直到成功为止。

public boolean $ensureUnique false
$immutable 公共属性 (自版本 2.0.2 起可用)

如果 slug 之前已经生成,是否生成新的 slug。如果为 true,即使 $attribute 更改,该行为也不会生成新的 slug。

public boolean $immutable false
$skipOnEmpty 公共属性 (自版本 2.0.13 起可用)

如果 $attribute 为空或空字符串,是否跳过 slug 生成。如果为 true,如果 $attribute 为空或空字符串,该行为将不会生成新的 slug。

public boolean $skipOnEmpty false
$slugAttribute 公共属性

将接收 Slug 值的属性

public string $slugAttribute 'slug'
$uniqueSlugGenerator 公共属性

Slug 唯一值生成器。如果 $ensureUnique 启用且生成的 slug 不唯一,则使用它。这应该是一个具有以下签名的 PHP 可调用函数

function ($baseSlug, $iteration, $model)
{
    // return uniqueSlug
}

如果没有设置,则生成的唯一 slug 将在基础 slug 后添加递增的后缀。

$uniqueValidator 公共属性

slug 唯一性验证器的配置。可以省略参数 'class' - 默认情况下将使用 yii\validators\UniqueValidator

另请参阅 yii\validators\UniqueValidator

public array $uniqueValidator = []
$value 公共属性

将用作 slug 的值。这可以是匿名函数或任意值或 null。如果是前者,则函数的返回值将用作 slug。如果为 null,则将使用 $attribute 属性生成 slug。函数的签名应如下所示,

function ($event)
{
    // return slug
}
public callable|string|null $value null

方法详情

隐藏继承的方法

__call() 公共方法

定义于: yii\base\BaseObject::__call()

调用不是类方法的命名方法。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时将隐式调用它。

public mixed __call ( $name, $params )
$name string

方法名

$params array

方法参数

return mixed

方法返回值

throws yii\base\UnknownMethodException

当调用未知方法时

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() 公共方法

定义于: yii\base\BaseObject::__construct()

构造函数。

默认实现做两件事

  • 使用给定的配置 $config 初始化对象。
  • 调用 init()

如果此方法在子类中被覆盖,建议

  • 构造函数的最后一个参数是一个配置数组,就像这里的 $config 一样。
  • 在构造函数的末尾调用父实现。
public void __construct ( $config = [] )
$config array

将用于初始化对象属性的名称-值对

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() 公共方法

定义于: yii\base\BaseObject::__get()

返回对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行 $value = $object->property; 时将隐式调用它。

另请参阅 __set()

public mixed __get ( $name )
$name string

属性名

return mixed

属性值

throws yii\base\UnknownPropertyException

如果属性未定义

throws yii\base\InvalidCallException

如果属性是只写属性

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    } elseif (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() 公共方法

定义于: yii\base\BaseObject::__isset()

检查属性是否已设置,即已定义且不为空。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当执行 isset($object->property) 时将隐式调用它。

注意,如果属性未定义,将返回 false。

另请参阅 https://php.ac.cn/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

属性名或事件名

return boolean

命名的属性是否已设置(非空)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() 公共方法

定义于: yii\base\BaseObject::__set()

设置对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,会在执行 $object->property = $value; 时被隐式调用。

另请参见 __get().

public void __set ( $name, $value )
$name string

属性名或事件名

$value mixed

属性值

throws yii\base\UnknownPropertyException

如果属性未定义

throws yii\base\InvalidCallException

如果属性为只读

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter($value);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    } else {
        throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }
}

            
__unset() 公共方法

定义于: yii\base\BaseObject::__unset()

将对象属性设置为 null。

不要直接调用此方法,因为它是一个 PHP 魔术方法,会在执行 unset($object->property) 时被隐式调用。

请注意,如果属性未定义,此方法将不执行任何操作。如果属性为只读,它将抛出异常。

另请参见 https://php.ac.cn/manual/en/function.unset.php.

public void __unset ( $name )
$name string

属性名

throws yii\base\InvalidCallException

如果属性为只读。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    }
}

            
attach() 公共方法

定义于: yii\base\Behavior::attach()

将行为对象附加到组件。

默认实现将设置 $owner 属性并附加在 events() 中声明的事件处理程序。如果您覆盖此方法,请确保调用父实现。

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

此行为要附加到的组件。

                public function attach($owner)
{
    $this->owner = $owner;
    foreach ($this->events() as $event => $handler) {
        $this->_attachedEvents[$event] = $handler;
        $owner->on($event, is_string($handler) ? [$this, $handler] : $handler);
    }
}

            
canGetProperty() 公共方法

定义于: yii\base\BaseObject::canGetProperty()

返回一个值,指示是否可以读取属性。

属性可读,如果

  • 该类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有具有指定名称的成员变量(当 $checkVars 为真时);

另请参见 canSetProperty().

public boolean canGetProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

return boolean

属性是否可读

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() 公共方法

定义于: yii\base\BaseObject::canSetProperty()

返回一个值,指示是否可以设置属性。

属性可写,如果

  • 该类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有具有指定名称的成员变量(当 $checkVars 为真时);

另请参见 canGetProperty().

public boolean canSetProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

return boolean

属性是否可写

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
className() 公共静态方法
自 2.0.14 版本起已弃用。在 PHP >=5.5 上,请使用 ::class 代替。

定义于: yii\base\BaseObject::className()

返回此类的完全限定名。

public static string className ( )
return string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
detach() 公共方法

定义于: yii\base\Behavior::detach()

从组件中分离行为对象。

默认实现将取消设置 $owner 属性并分离在 events() 中声明的事件处理程序。如果您覆盖此方法,请确保调用父实现。

public void detach ( )

                public function detach()
{
    if ($this->owner) {
        foreach ($this->_attachedEvents as $event => $handler) {
            $this->owner->off($event, is_string($handler) ? [$this, $handler] : $handler);
        }
        $this->_attachedEvents = [];
        $this->owner = null;
    }
}

            
evaluateAttributes() 公共方法

定义于: yii\behaviors\AttributeBehavior::evaluateAttributes()

评估属性值并将其分配给当前属性。

public void evaluateAttributes ( $event )
$event yii\base\Event

                public function evaluateAttributes($event)
{
    if (
        $this->skipUpdateOnClean
        && $event->name == ActiveRecord::EVENT_BEFORE_UPDATE
        && empty($this->owner->dirtyAttributes)
    ) {
        return;
    }
    if (!empty($this->attributes[$event->name])) {
        $attributes = (array) $this->attributes[$event->name];
        $value = $this->getValue($event);
        foreach ($attributes as $attribute) {
            // ignore attribute names which are not string (e.g. when set by TimestampBehavior::updatedAtAttribute)
            if (is_string($attribute)) {
                if ($this->preserveNonEmptyValues && !empty($this->owner->$attribute)) {
                    continue;
                }
                $this->owner->$attribute = $value;
            }
        }
    }
}

            
events() 公共方法

定义于: yii\behaviors\AttributeBehavior::events()

$owner 的事件声明事件处理程序。

子类可以重写此方法来声明应附加到 $owner 组件事件的 PHP 回调。

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

回调可以是以下任何一种

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

以下是一个示例

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

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

                public function events()
{
    return array_fill_keys(
        array_keys($this->attributes),
        'evaluateAttributes'
    );
}

            
generateSlug() 受保护方法

此方法由 getValue() 调用以生成 Slug。

您可以覆盖它来自定义 slug 生成。默认实现调用 yii\helpers\Inflector::slug() 对由连字符 (-) 连接的输入字符串进行处理。

protected string generateSlug ( $slugParts )
$slugParts array

应该连接并转换为生成 slug 值的字符串数组。

return string

转换结果。

                protected function generateSlug($slugParts)
{
    return Inflector::slug(implode('-', $slugParts));
}

            
generateUniqueSlug() 受保护方法

使用配置的回调或迭代增量来生成 Slug。

protected string generateUniqueSlug ( $baseSlug, $iteration )
$baseSlug string

基本 slug 值

$iteration integer

迭代次数

return string

新 slug 值

throws yii\base\InvalidConfigException

                protected function generateUniqueSlug($baseSlug, $iteration)
{
    if (is_callable($this->uniqueSlugGenerator)) {
        return call_user_func($this->uniqueSlugGenerator, $baseSlug, $iteration, $this->owner);
    }
    return $baseSlug . '-' . ($iteration + 1);
}

            
getValue() 受保护方法

返回当前属性的值。

此方法由 evaluateAttributes() 调用。它的返回值将被分配给与触发事件对应的属性。

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

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

return mixed

属性值

                protected function getValue($event)
{
    if (!$this->isNewSlugNeeded()) {
        return $this->owner->{$this->slugAttribute};
    }
    if ($this->attribute !== null) {
        $slugParts = [];
        foreach ((array) $this->attribute as $attribute) {
            $part = ArrayHelper::getValue($this->owner, $attribute);
            if ($this->skipOnEmpty && $this->isEmpty($part)) {
                return $this->owner->{$this->slugAttribute};
            }
            $slugParts[] = $part;
        }
        $slug = $this->generateSlug($slugParts);
    } else {
        $slug = parent::getValue($event);
    }
    return $this->ensureUnique ? $this->makeUnique($slug) : $slug;
}

            
hasMethod() 公共方法

定义于: yii\base\BaseObject::hasMethod()

返回一个值,指示是否定义了方法。

默认实现是调用 php 函数 method_exists()。当您实现 php 魔法方法 __call() 时,您可以覆盖此方法。

public boolean hasMethod ( $name )
$name string

方法名

return boolean

该方法是否已定义

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasProperty() 公共方法

定义于: yii\base\BaseObject::hasProperty()

返回一个值,指示是否定义了属性。

如果属性被定义,则

  • 该类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
  • 该类具有具有指定名称的成员变量(当 $checkVars 为真时);

另请参阅

public boolean hasProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

return boolean

该属性是否已定义

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() 公共方法

初始化对象。

此方法在构造函数结束时调用,在对象使用给定配置初始化后调用。

public void init ( )

                public function init()
{
    parent::init();
    if (empty($this->attributes)) {
        $this->attributes = [BaseActiveRecord::EVENT_BEFORE_VALIDATE => $this->slugAttribute];
    }
    if ($this->attribute === null && $this->value === null) {
        throw new InvalidConfigException('Either "attribute" or "value" property must be specified.');
    }
}

            
isEmpty() 受保护方法 (自 2.0.13 版本起可用)

检查 $slugPart 是否为空字符串或 null。

protected boolean isEmpty ( $slugPart )
$slugPart string

用于生成 slug 的属性之一。

return boolean

$slugPart 是否为空。

                protected function isEmpty($slugPart)
{
    return $slugPart === null || $slugPart === '';
}

            
isNewSlugNeeded() 受保护方法 (自 2.0.7 版本起可用)

检查是否需要生成新的 Slug。此方法由 getValue() 调用以检查是否需要生成新的 Slug。

您可以覆盖它来自定义检查。

protected boolean isNewSlugNeeded ( )

                protected function isNewSlugNeeded()
{
    if (empty($this->owner->{$this->slugAttribute})) {
        return true;
    }
    if ($this->immutable) {
        return false;
    }
    if ($this->attribute === null) {
        return true;
    }
    foreach ((array) $this->attribute as $attribute) {
        if ($this->owner->isAttributeChanged($attribute)) {
            return true;
        }
    }
    return false;
}

            
makeUnique() 受保护方法 (自 2.0.7 版本起可用)

$ensureUnique 为 true 时,此方法由 getValue() 调用以生成唯一的 Slug。

调用 generateUniqueSlug() 直到生成的 slug 唯一并返回它。

另请参阅

protected string makeUnique ( $slug )
$slug string

基本 slug 值

return string

唯一 slug

                protected function makeUnique($slug)
{
    $uniqueSlug = $slug;
    $iteration = 0;
    while (!$this->validateSlug($uniqueSlug)) {
        $iteration++;
        $uniqueSlug = $this->generateUniqueSlug($slug, $iteration);
    }
    return $uniqueSlug;
}

            
validateSlug() 受保护方法

检查给定的 Slug 值是否唯一。

protected boolean validateSlug ( $slug )
$slug string

Slug 值

return boolean

Slug 是否唯一。

                protected function validateSlug($slug)
{
    /* @var $validator UniqueValidator */
    /* @var $model BaseActiveRecord */
    $validator = Yii::createObject(array_merge(
        [
            'class' => UniqueValidator::className(),
        ],
        $this->uniqueValidator
    ));
    $model = clone $this->owner;
    $model->clearErrors();
    $model->{$this->slugAttribute} = $slug;
    $validator->validateAttribute($model, $this->slugAttribute);
    return !$model->hasErrors();
}