0 フォロワー

クラス yii\behaviors\AttributesBehavior

継承yii\behaviors\AttributesBehavior » yii\base\Behavior » yii\base\BaseObject
実装yii\base\Configurable
利用可能なバージョン2.0.13
ソースコード https://github.com/yiisoft/yii2/blob/master/framework/behaviors/AttributesBehavior.php

AttributesBehavior は、特定イベント発生時に ActiveRecord オブジェクトの 1 つまたは複数の属性に指定された値を自動的に割り当てます。

AttributesBehavior を使用するには、更新が必要な属性のリストと更新をトリガーする対応イベントを指定する $attributes プロパティを設定します。次に、囲まれた配列の値を、現在の属性に割り当てるために返り値が使用される PHP コールバックで設定します。例えば、

use yii\behaviors\AttributesBehavior;

public function behaviors()
{
    return [
        [
            'class' => AttributesBehavior::class,
            '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 囲まれた配列を介して指定された値で自動的に埋められる属性のリスト。 yii\behaviors\AttributesBehavior
$order array イベントで自動的に埋められる属性の順序のリスト。 yii\behaviors\AttributesBehavior
$owner yii\base\Component|null この動作の所有者 yii\base\Behavior
$preserveNonEmptyValues boolean 空でない属性値を保持するかどうか。 yii\behaviors\AttributesBehavior
$skipUpdateOnClean boolean $owner が変更されていない場合、この動作をスキップするかどうか yii\behaviors\AttributesBehavior

公開メソッド

継承されたメソッドを隠す

メソッド 説明 定義元
__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\AttributesBehavior
events() $owner のイベントのイベントハンドラーを宣言します。 yii\behaviors\AttributesBehavior
hasMethod() メソッドが定義されているかどうかを示す値を返します。 yii\base\BaseObject
hasProperty() プロパティが定義されているかどうかを示す値を返します。 yii\base\BaseObject
init() オブジェクトを初期化します。 yii\base\BaseObject

保護メソッド

継承されたメソッドを隠す

メソッド 説明 定義元
getValue() 現在の属性の値を返します。 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 が変更されていない場合、この動作をスキップするかどうか

メソッドの詳細

継承されたメソッドを隠す

__call() public メソッド

定義元: 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() public メソッド

定義元: 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();
}

            
__get() public メソッド

定義元: yii\base\BaseObject::__get()

オブジェクトプロパティの値を返します。

このメソッドは、 $value = $object->property; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

参考: __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() public メソッド

定義元: yii\base\BaseObject::__isset()

プロパティが設定されているか (つまり、定義されていて null ではないか) を確認します。

このメソッドは、 isset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

プロパティが定義されていない場合、falseが返されることに注意してください。

参考: https://www.php.net/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

プロパティ名またはイベント名

return boolean

指定されたプロパティが設定されている(nullではない)かどうか。

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

            
__set() public メソッド

定義元: yii\base\BaseObject::__set()

オブジェクトプロパティの値を設定します。

このメソッドは、 $object->property = $value; を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

参考: __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() public メソッド

定義元: yii\base\BaseObject::__unset()

オブジェクトプロパティを null に設定します。

このメソッドは、 unset($object->property) を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

プロパティが定義されていない場合、このメソッドは何もしないことに注意してください。プロパティが読み取り専用の場合、例外がスローされます。

参考: https://www.php.net/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() public メソッド

定義元: 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() public メソッド

定義元: yii\base\BaseObject::canGetProperty()

プロパティを読み取ることができるかどうかを示す値を返します。

プロパティが読み取り可能であるための条件は次のとおりです。

  • クラスが、指定された名前に関連付けられたゲッターメソッドを持っている場合(この場合、プロパティ名は大文字小文字を区別しません)。
  • クラスが、指定された名前を持つメンバ変数を持っている場合($checkVars が true の場合)。

参考: 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() public メソッド

定義元: yii\base\BaseObject::canSetProperty()

プロパティを設定できるかどうかを示す値を返します。

プロパティが書き込み可能であるための条件は次のとおりです。

  • クラスが、指定された名前に関連付けられたセッターメソッドを持っている場合(この場合、プロパティ名は大文字小文字を区別しません)。
  • クラスが、指定された名前を持つメンバ変数を持っている場合($checkVars が true の場合)。

参考: 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() public static メソッド
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() public メソッド

定義元: 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() public メソッド

属性値を評価し、現在の属性に割り当てます。

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;
    }
    $attributes = array_keys(array_filter($this->attributes, function ($carry) use ($event) {
        return array_key_exists($event->name, $carry);
    }));
    if (!empty($this->order[$event->name])) {
        $attributes = array_merge(
            array_intersect((array) $this->order[$event->name], $attributes),
            array_diff($attributes, (array) $this->order[$event->name])
        );
    }
    foreach ($attributes as $attribute) {
        if ($this->preserveNonEmptyValues && !empty($this->owner->$attribute)) {
            continue;
        }
        $this->owner->$attribute = $this->getValue($attribute, $event);
    }
}

            
events() public メソッド

$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_reduce($this->attributes, function ($carry, $item) {
            return array_merge($carry, array_keys($item));
        }, []),
        'evaluateAttributes'
    );
}

            
getValue() protected メソッド

現在の属性の値を返します。

このメソッドは evaluateAttributes() によって呼び出されます。その戻り値は、トリガーとなるイベントに対応するターゲット属性に割り当てられます。

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

ターゲット属性名

$event yii\base\Event

現在の属性の更新をトリガーするイベント。

return mixed

属性値

                protected function getValue($attribute, $event)
{
    if (!isset($this->attributes[$attribute][$event->name])) {
        return null;
    }
    $value = $this->attributes[$attribute][$event->name];
    if ($value instanceof Closure || (is_array($value) && is_callable($value))) {
        return $value($event, $attribute);
    }
    return $value;
}

            
hasMethod() public メソッド

定義元: 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() public メソッド

定義元: yii\base\BaseObject::hasProperty()

プロパティが定義されているかどうかを示す値を返します。

プロパティが定義されているのは、

  • クラスに、指定された名前に関連付けられたゲッターまたはセッターメソッドがある場合(この場合、プロパティ名は、大文字と小文字を区別しません)。
  • クラスが、指定された名前を持つメンバ変数を持っている場合($checkVars が true の場合)。

以下も参照

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 メソッド

定義元: yii\base\BaseObject::init()

オブジェクトを初期化します。

このメソッドは、オブジェクトが指定された構成で初期化された後、コンストラクタの最後に呼び出されます。

public void init ( )

                public function init()
{
}