クラス yii\behaviors\AttributesBehavior
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 |
プロパティの詳細
囲まれた配列を介して指定された値で自動的に埋められる属性のリスト。配列キーは、イベントが更新される 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;
},
],
]
イベントで自動的に埋められる属性の順序のリスト。配列キーは、属性が更新される ActiveRecord イベントであり、配列値は対応する属性の順序を表します。残りの属性は最後に処理されます。$attributes でこの属性のイベントが指定されていない場合、無視されます。
[
ActiveRecord::EVENT_BEFORE_VALIDATE => ['attribute1', 'attribute2'],
ActiveRecord::EVENT_AFTER_VALIDATE => ['attribute2', 'attribute1'],
]
$owner
が変更されていない場合、この動作をスキップするかどうか
メソッドの詳細
定義元: 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()");
}
定義元: 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()
オブジェクトプロパティの値を返します。
このメソッドは、 $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);
}
定義元: yii\base\BaseObject::__isset()
プロパティが設定されているか (つまり、定義されていて null ではないか) を確認します。
このメソッドは、 isset($object->property)
を実行するときに暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。
プロパティが定義されていない場合、falseが返されることに注意してください。
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;
}
定義元: 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);
}
}
定義元: yii\base\BaseObject::__unset()
オブジェクトプロパティを null に設定します。
このメソッドは、 unset($object->property)
を実行するときに暗黙的に呼び出される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);
}
}
定義元: 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 |
メンバ変数をプロパティとして扱うかどうか |
return | 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 |
メンバ変数をプロパティとして扱うかどうか |
return | boolean |
プロパティが書き込み可能かどうかを判定します。 |
---|
public function canSetProperty($name, $checkVars = true)
{
return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}
::class
を代わりに使用してください。
定義元: yii\base\BaseObject::className()
このクラスの完全修飾名を返します。
public static string className ( ) | ||
return | 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;
}
}
属性値を評価し、現在の属性に割り当てます。
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);
}
}
$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'
);
}
現在の属性の値を返します。
このメソッドは 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;
}
定義元: 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);
}
定義元: 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);
}
public void init ( ) |
public function init()
{
}
サインアップ または ログイン してコメントしてください。