クラス yii\behaviors\SluggableBehavior
SluggableBehavior は、指定された属性に、URL のスラッグとして使用できる値を自動的に設定します。
注記: このビヘイビアは、転写のための php-intl 拡張機能に依存しています。インストールされていない場合は、yii\helpers\Inflector::$transliteration で定義されている置換にフォールバックします。
SluggableBehavior を使用するには、次のコードを ActiveRecord クラスに追加します。
use yii\behaviors\SluggableBehavior;
public function behaviors()
{
return [
[
'class' => SluggableBehavior::class,
'attribute' => 'title',
// 'slugAttribute' => 'slug',
],
];
}
デフォルトでは、SluggableBehavior は、関連付けられた AR オブジェクトが検証されているときに、URL でスラッグとして使用できる値で `slug` 属性を設定します。
属性値はこのビヘイビアによって自動的に設定されるため、通常はユーザー入力ではなく、検証する必要はありません。つまり、`slug` 属性は、モデルの rules() メソッドに表示されるべきではありません。
属性名が異なる場合は、次のように $slugAttribute プロパティを設定できます。
public function behaviors()
{
return [
[
'class' => SluggableBehavior::class,
'slugAttribute' => 'alias',
],
];
}
公開プロパティ
公開メソッド
メソッド | 説明 | 定義元 |
---|---|---|
__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\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()によって呼び出されます。 | yii\behaviors\SluggableBehavior |
generateUniqueSlug() | 設定されたコールバックまたは繰り返し回数によるインクリメントを使用してスラッグを生成します。 | yii\behaviors\SluggableBehavior |
getValue() | 現在の属性の値を返します。 | yii\behaviors\SluggableBehavior |
isEmpty() | $slugPartが空文字列またはnullかどうかを確認します。 | yii\behaviors\SluggableBehavior |
isNewSlugNeeded() | 新しいスラッグの生成が必要かどうかを確認します。このメソッドは、新しいスラッグの生成が必要かどうかを確認するためにgetValue()によって呼び出されます。 | yii\behaviors\SluggableBehavior |
makeUnique() | $ensureUniqueがtrueの場合、一意のスラッグを生成するためにgetValue()によって呼び出されます。 | yii\behaviors\SluggableBehavior |
validateSlug() | 指定されたスラッグ値が一意かどうかを確認します。 | yii\behaviors\SluggableBehavior |
プロパティの詳細
スラッグに変換される属性または属性のリスト、またはスラッグの生成に `$value` プロパティが使用されることを意味する `null`。
生成されたスラッグ値がオーナーのクラスレコード間で一意であることを保証するかどうか。有効にすると、ビヘイビアは自動的にスラッグの一意性を検証します。検証に失敗した場合、成功するまで基本的なスラッグにインクリメントされたサフィックスを追加して一意のスラッグ値を生成しようとします。
以前に生成された場合でも新しいスラッグを生成するかどうか。trueの場合、$attributeが変更されても、ビヘイビアは新しいスラッグを生成しません。
$attributeがnullまたは空文字列の場合に、スラッグの生成をスキップするかどうか。trueの場合、$attributeがnullまたは空文字列の場合、ビヘイビアは新しいスラッグを生成しません。
スラッグの一意値ジェネレーター。$ensureUniqueが有効で、生成されたスラッグが一意でない場合に使用されます。これは、次のシグネチャを持つPHPのcallableである必要があります。
function ($baseSlug, $iteration, $model)
{
// return uniqueSlug
}
設定されていない場合、一意のスラッグは、基本的なスラッグにインクリメントされたサフィックスを追加して生成されます。
スラッグの一意性バリデーターの設定。パラメータ'class'は省略できます - デフォルトではyii\validators\UniqueValidatorが使用されます。
yii\validators\UniqueValidatorも参照してください。
メソッドの詳細
定義場所: yii\base\BaseObject::__call()
クラスメソッドではない名前付きメソッドを呼び出します。
これはPHPのマジックメソッドであり、不明なメソッドが呼び出されたときに暗黙的に呼び出されるため、直接呼び出さないでください。
public mixed __call ( $name, $params ) | ||
$name | string |
メソッド名 |
$params | array |
メソッドパラメータ |
戻り値 | mixed |
メソッドの戻り値 |
---|---|---|
例外 | yii\base\UnknownMethodException |
不明なメソッドを呼び出した場合 |
public function __call($name, $params)
{
throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}
定義場所: yii\base\BaseObject::__construct()
コンストラクタ。
デフォルトの実装は2つのことを行います。
- 指定された設定
$config
を使用してオブジェクトを初期化します。 - init()を呼び出します。
このメソッドが子クラスでオーバーライドされている場合、
- コンストラクタの最後のパラメータは、ここにある
$config
のような設定配列にすることをお勧めします。 - コンストラクタの最後に親の実装を呼び出してください。
public void __construct ( $config = [] ) | ||
$config | array |
オブジェクトのプロパティを初期化するために使用される名前と値のペア |
public function __construct($config = [])
{
if (!empty($config)) {
Yii::configure($this, $config);
}
$this->init();
}
定義位置: yii\base\BaseObject::__get()
オブジェクトプロパティの値を返します。
これはPHPのマジックメソッドであり、`$value = $object->property;`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください __set().
public mixed __get ( $name ) | ||
$name | string |
プロパティ名 |
戻り値 | mixed |
プロパティの値 |
---|---|---|
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
例外 | 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);
}
定義位置: yii\base\BaseObject::__isset()
プロパティが設定されているかどうか(定義されていて null でないかどうか)をチェックします。
これはPHPのマジックメソッドであり、`isset($object->property)`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
プロパティが定義されていない場合は、falseが返されることに注意してください。
こちらも参照してください https://www.php.net/manual/en/function.isset.php.
public boolean __isset ( $name ) | ||
$name | string |
プロパティ名またはイベント名 |
戻り値 | boolean |
指定されたプロパティが設定されているかどうか(nullではないか)。 |
---|
public function __isset($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter() !== null;
}
return false;
}
定義位置: yii\base\BaseObject::__set()
オブジェクトプロパティの値を設定します。
これはPHPのマジックメソッドであり、`$object->property = $value;`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
こちらも参照してください __get().
public void __set ( $name, $value ) | ||
$name | string |
プロパティ名またはイベント名 |
$value | mixed |
プロパティの値 |
例外 | yii\base\UnknownPropertyException |
プロパティが定義されていない場合 |
---|---|---|
例外 | 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);
}
}
定義位置: yii\base\BaseObject::__unset()
オブジェクトプロパティを null に設定します。
これはPHPのマジックメソッドであり、`unset($object->property)`を実行した際に暗黙的に呼び出されるため、直接呼び出さないでください。
プロパティが定義されていない場合は、このメソッドは何もしません。プロパティが読み取り専用の場合は、例外をスローします。
こちらも参照してください https://www.php.net/manual/en/function.unset.php.
public void __unset ( $name ) | ||
$name | string |
プロパティ名 |
例外 | 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);
}
}
定義位置: 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);
}
}
定義位置: yii\base\BaseObject::canGetProperty()
プロパティが読み取り可能かどうかを示す値を返します。
プロパティは、以下の場合に読み取り可能です。
- クラスに、指定された名前と関連付けられたゲッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバ変数がある場合(`$checkVars`がtrueの場合)。
こちらも参照してください canSetProperty().
public boolean canGetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティを読み取ることができるかどうか |
---|
public function canGetProperty($name, $checkVars = true)
{
return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}
定義位置: yii\base\BaseObject::canSetProperty()
プロパティが設定可能かどうかを示す値を返します。
プロパティは、以下の場合に書き込み可能です。
- クラスに、指定された名前と関連付けられたセッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
- クラスに、指定された名前のメンバ変数がある場合(`$checkVars`がtrueの場合)。
こちらも参照してください canGetProperty().
public boolean canSetProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティを書き込むことができるかどうか |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
定義位置: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
戻り値 | string |
このクラスの完全修飾名。 |
---|
public static function className()
{
return get_called_class();
}
定義位置: 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;
}
}
定義位置: 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;
}
}
}
}
定義位置: 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 ( ) | ||
戻り値 | array |
イベント(配列キー)と対応するイベントハンドラメソッド(配列値)。 |
---|
public function events()
{
return array_fill_keys(
array_keys($this->attributes),
'evaluateAttributes'
);
}
このメソッドは、スラッグを生成するためにgetValue()によって呼び出されます。
スラッグ生成をカスタマイズするためにオーバーライドできます。デフォルトの実装では、ハイフン(-
)で連結された入力文字列にyii\helpers\Inflector::slug()を呼び出します。
protected string generateSlug ( $slugParts ) | ||
$slugParts | array |
連結してスラッグ値を生成するために変換する必要がある文字列の配列。 |
戻り値 | string |
変換結果。 |
---|
protected function generateSlug($slugParts)
{
return Inflector::slug(implode('-', $slugParts));
}
設定されたコールバックまたは繰り返し回数によるインクリメントを使用してスラッグを生成します。
protected string generateUniqueSlug ( $baseSlug, $iteration ) | ||
$baseSlug | string |
基本的なスラッグ値。 |
$iteration | 整数 |
繰り返し回数。 |
戻り値 | string |
新しいスラッグ値。 |
---|---|---|
例外 | 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);
}
現在の属性の値を返します。
このメソッドはevaluateAttributes()によって呼び出されます。その戻り値は、トリガーイベントに対応する属性に割り当てられます。
protected mixed getValue ( $event ) | ||
$event | yii\base\Event |
現在の属性の更新をトリガーするイベント。 |
戻り値 | 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;
}
定義されている場所: yii\base\BaseObject::hasMethod()
メソッドが定義されているかどうかを示す値を返します。
デフォルトの実装は、PHP関数method_exists()
の呼び出しです。PHPマジックメソッド__call()
を実装した場合は、このメソッドをオーバーライドできます。
public boolean hasMethod ( $name ) | ||
$name | string |
メソッド名 |
戻り値 | boolean |
メソッドが定義されているかどうか。 |
---|
public function hasMethod($name)
{
return method_exists($this, $name);
}
定義されている場所: yii\base\BaseObject::hasProperty()
プロパティが定義されているかどうかを示す値を返します。
プロパティは、以下の場合に定義されます。
- クラスに、指定された名前と関連付けられたゲッターまたはセッターメソッドがある場合(この場合、プロパティ名は大文字小文字を区別しません)。
- クラスに、指定された名前のメンバ変数がある場合(`$checkVars`がtrueの場合)。
参照
public boolean hasProperty ( $name, $checkVars = true ) | ||
$name | string |
プロパティ名 |
$checkVars | boolean |
メンバ変数をプロパティとして扱うかどうか |
戻り値 | boolean |
プロパティが定義されているかどうか。 |
---|
public function hasProperty($name, $checkVars = true)
{
return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}
オブジェクトを初期化します。
このメソッドは、オブジェクトが指定された設定で初期化された後、コンストラクタの最後に呼び出されます。
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.');
}
}
$slugPartが空文字列またはnullかどうかを確認します。
protected boolean isEmpty ( $slugPart ) | ||
$slugPart | string |
スラッグ生成に使用される属性の1つ。 |
戻り値 | boolean |
$slugPartが空かどうか。 |
---|
protected function isEmpty($slugPart)
{
return $slugPart === null || $slugPart === '';
}
新しいスラッグの生成が必要かどうかを確認します。このメソッドは、新しいスラッグの生成が必要かどうかを確認するためにgetValue()によって呼び出されます。
チェックをカスタマイズするためにオーバーライドできます。
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;
}
$ensureUniqueがtrueの場合、一意のスラッグを生成するためにgetValue()によって呼び出されます。
generateUniqueSlug()を生成されたスラッグが一意になるまで呼び出し、それを返します。
参照
protected string makeUnique ( $slug ) | ||
$slug | string |
基本的なスラッグ値。 |
戻り値 | string |
一意のスラッグ。 |
---|
protected function makeUnique($slug)
{
$uniqueSlug = $slug;
$iteration = 0;
while (!$this->validateSlug($uniqueSlug)) {
$iteration++;
$uniqueSlug = $this->generateUniqueSlug($slug, $iteration);
}
return $uniqueSlug;
}
指定されたスラッグ値が一意かどうかを確認します。
protected boolean validateSlug ( $slug ) | ||
$slug | string |
スラッグ値。 |
戻り値 | boolean |
スラッグが一意かどうか。 |
---|
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();
}
コメントするにはサインアップまたはログインしてください。