Class yii\behaviors\SluggableBehavior
SluggableBehavior 自动地给指定的属性填充值,这些值可以在 URL 中用作 slug。
Note: 这个行为依赖于 php-intl 扩展来完成转译。如果没有安装这个扩展, 将会退一步用 yii\helpers\Inflector::$transliteration 来替换。
要使用 SluggableBehavior,把下面的代码插入到 ActiveRecord 类中:
use yii\behaviors\SluggableBehavior;
public function behaviors()
{
return [
[
'class' => SluggableBehavior::className(),
'attribute' => 'title',
// 'slugAttribute' => 'slug',
],
];
}
默认情况下,SluggableBehavior 会在关联的 AR 对象执行验证过程中填充 slug
属性的值,
该值可以在 URL 中用作 slug。
由于属性值是被这个行为自动设置,所以它不必用户输入也因此没有必要验证。
因此,slug
属性不应该出现在 rules() 这个模型方法中。
如果你的属性名不是 slug
,那么你可以像下面那样配置 $slugAttribute 属性来调整:
public function behaviors()
{
return [
[
'class' => SluggableBehavior::className(),
'slugAttribute' => 'alias',
],
];
}
公共属性
属性 | 类型 | 描述 | 被定义在 |
---|---|---|---|
$attribute | string|array|null | 单个属性或者属性列表,它们的值将会转译为 slug,
如果是 null 那么将会用 $value 属性来生成 slug。 |
yii\behaviors\SluggableBehavior |
$attributes | array | 属性列表,属性的值将由 $value 自动填充。
数组的键是 ActiveRecord 的事件,属性就是更新于这些事件之上,
数组的值就是要更新的属性。
你可以用字符串来表示一个单独的属性也可以用一个数组来表示一系列属性。比如,
` php
[
ActiveRecord::EVENT_BEFORE_INSERT => ['attribute1', 'attribute2'],
ActiveRecord::EVENT_BEFORE_UPDATE => 'attribute2',
]
` |
yii\behaviors\AttributeBehavior |
$ensureUnique | boolean | 是否确保生成的 slug 值在属主 AR 类的所有记录里是唯一的。 如果设置为 true,行为将会自动验证 slug 的唯一性。验证失败的话, 它还会在重复的 slug 基础上不断尝试生成一个唯一的 slug,直到它不再是重复的 slug 为止。 | yii\behaviors\SluggableBehavior |
$immutable | boolean | 如果之前已经生成过的话,是否需要生成一个全新的 slug。 如果是 true,该行为不会生成新的 slug,即使 $attribute 有变化了。 | yii\behaviors\SluggableBehavior |
$owner | yii\base\Component|null | The owner of this behavior | yii\base\Behavior |
$preserveNonEmptyValues | boolean | 是否保留非空的属性值 | yii\behaviors\AttributeBehavior |
$skipOnEmpty | boolean | 如果 $attribute 是 null 或者是一个空字符串时,是否跳过 slug 的生成过程。 如果是 true,那么在 $attribute 是 null 或者是一个空字符串时就不会生成一个新的 slug。 | yii\behaviors\SluggableBehavior |
$skipUpdateOnClean | boolean | 当 $owner
没有更新的时候是否跳过这个行为 |
yii\behaviors\AttributeBehavior |
$slugAttribute | string | 接收 slug 值的属性。 | yii\behaviors\SluggableBehavior |
$uniqueSlugGenerator | callable | Slug 唯一值生成器。当启用了 $ensureUnique 并且生成了不唯一的 slug 时使用。
唯一值生成器的函数签名应该是下面这样的:
` php
function ($baseSlug, $iteration, $model)
{
// return uniqueSlug
}
`
如果没有配置唯一值生成器,行为将给原来重复的 slug 填充后缀使之达到唯一性。 |
yii\behaviors\SluggableBehavior |
$uniqueValidator | array | Slug 的唯一性验证器配置数组。参数 'class' 可以忽略为空, 默认情况下,将会使用 yii\validators\UniqueValidator 作为唯一性验证器。 | yii\behaviors\SluggableBehavior |
$value | callable|string|null | 用来生成 slug 的值。它可以是一个匿名函数,
或者是任意的值或者 null。如果是前者,匿名函数的返回值将会当作 slug。
如果是 null ,那么使用 $attribute 属性生成 slug。
匿名函数的签名应该是这样的,
` php
function ($event)
{
// return slug
}
` |
yii\behaviors\SluggableBehavior |
公共方法
方法 | 描述 | 被定义在 |
---|---|---|
__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\AttributeBehavior |
events() | Declares event handlers for the $owner's events. | yii\behaviors\AttributeBehavior |
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\behaviors\SluggableBehavior |
受保护的方法
方法 | 描述 | 被定义在 |
---|---|---|
generateSlug() | 该方法在 getValue() 中调用,用来生成 slug。
你可以通过覆盖它来自定义 slug 的生成过程。
默认的实现就是调用 yii\helpers\Inflector::slug(),
参数就是用连字符(- )拼接过的字符串。 |
yii\behaviors\SluggableBehavior |
generateUniqueSlug() | 用配置好的回调或者迭代填充的方法生成 slug。 | yii\behaviors\SluggableBehavior |
getValue() | 返回给当前属性准备的值。 该方法在 evaluateAttributes() 里调用。 它的返回值将会设置到对应触发事件的属性上。 | yii\behaviors\SluggableBehavior |
isEmpty() | 检测 $slugPart 是否是空字符串或者 null。 | yii\behaviors\SluggableBehavior |
isNewSlugNeeded() | 检测是否有必要生成一个新的 slug。 该方法是在 getValue() 中调用,用来检测是否有必要生成一个新的slug。 你可以覆盖它实现自定义的检测过程。 | yii\behaviors\SluggableBehavior |
makeUnique() | 这个方法在 getValue() 中调用,当 $ensureUnique 为 true 时可以生成唯一的 slug。 循环调用 generateUniqueSlug() 直到生成了唯一的 slug,然后返回它。 | yii\behaviors\SluggableBehavior |
validateSlug() | 检测给定的 slug 是否是唯一的。 | yii\behaviors\SluggableBehavior |
属性详情
单个属性或者属性列表,它们的值将会转译为 slug,
如果是 null
那么将会用 $value 属性来生成 slug。
是否确保生成的 slug 值在属主 AR 类的所有记录里是唯一的。 如果设置为 true,行为将会自动验证 slug 的唯一性。验证失败的话, 它还会在重复的 slug 基础上不断尝试生成一个唯一的 slug,直到它不再是重复的 slug 为止。
如果之前已经生成过的话,是否需要生成一个全新的 slug。 如果是 true,该行为不会生成新的 slug,即使 $attribute 有变化了。
如果 $attribute 是 null 或者是一个空字符串时,是否跳过 slug 的生成过程。 如果是 true,那么在 $attribute 是 null 或者是一个空字符串时就不会生成一个新的 slug。
接收 slug 值的属性。
Slug 唯一值生成器。当启用了 $ensureUnique 并且生成了不唯一的 slug 时使用。 唯一值生成器的函数签名应该是下面这样的:
function ($baseSlug, $iteration, $model)
{
// return uniqueSlug
}
如果没有配置唯一值生成器,行为将给原来重复的 slug 填充后缀使之达到唯一性。
Slug 的唯一性验证器配置数组。参数 'class' 可以忽略为空, 默认情况下,将会使用 yii\validators\UniqueValidator 作为唯一性验证器。
用来生成 slug 的值。它可以是一个匿名函数,
或者是任意的值或者 null。如果是前者,匿名函数的返回值将会当作 slug。
如果是 null
,那么使用 $attribute
属性生成 slug。
匿名函数的签名应该是这样的,
function ($event)
{
// return slug
}
方法详情
该方法在 getValue() 中调用,用来生成 slug。
你可以通过覆盖它来自定义 slug 的生成过程。
默认的实现就是调用 yii\helpers\Inflector::slug(),
参数就是用连字符(-
)拼接过的字符串。
protected string generateSlug($slugParts) | ||
$slugParts | array | 一个字符串数组,通过拼接和转译来生成 slug 值。 |
return | string | 转译过的结果。 |
---|
用配置好的回调或者迭代填充的方法生成 slug。
protected string generateUniqueSlug($baseSlug, $iteration) | ||
$baseSlug | string | 原始 slug 值。 |
$iteration | integer | 迭代数字 |
return | string | 新的 slug 值。 |
---|---|---|
throws | yii\base\InvalidConfigException |
返回给当前属性准备的值。 该方法在 evaluateAttributes() 里调用。 它的返回值将会设置到对应触发事件的属性上。
protected mixed getValue($event) | ||
$event | yii\base\Event | 触发当前属性更新的事件 |
return | mixed | 属性值 |
---|
Initializes the object.
This method is invoked at the end of the constructor after the object is initialized with the given configuration.
public void init() |
检测 $slugPart 是否是空字符串或者 null。
protected boolean isEmpty($slugPart) | ||
$slugPart | string | 用来生成 slug 的属性列表里的一个属性。 |
return | boolean | 是否 $slugPart 为空。 |
---|
检测是否有必要生成一个新的 slug。 该方法是在 getValue() 中调用,用来检测是否有必要生成一个新的slug。 你可以覆盖它实现自定义的检测过程。
protected boolean isNewSlugNeeded() |
这个方法在 getValue() 中调用,当 $ensureUnique 为 true 时可以生成唯一的 slug。 循环调用 generateUniqueSlug() 直到生成了唯一的 slug,然后返回它。
参见:
protected string makeUnique($slug) | ||
$slug | string | 原始 slug 值。 |
return | string | 唯一的 slug。 |
---|
检测给定的 slug 是否是唯一的。
protected boolean validateSlug($slug) | ||
$slug | string | Slug 值。 |
return | boolean | 是否 slug 值是唯一的。 |
---|