0 フォロワー

トレイト yii\base\ArrayableTrait

実装元yii\base\DynamicModel, yii\base\Model, yii\data\ActiveDataFilter, yii\data\DataFilter, yii\db\ActiveRecord, yii\db\BaseActiveRecord
利用可能なバージョン2.0
ソースコード https://github.com/yiisoft/yii2/blob/master/framework/base/ArrayableTrait.php

ArrayableTrait は、yii\base\Arrayable インターフェイスの共通実装を提供します。

ArrayableTrait は、fields() および extraFields() で宣言されているフィールド定義に従って、toArray() を実装します。

パブリックメソッド

継承されたメソッドを非表示

メソッド 説明 定義元
extraFields() toArray() でさらに展開して返すことができるフィールドのリストを返します。 yii\base\ArrayableTrait
fields() 特定のフィールドが指定されていない場合に、toArray() によってデフォルトで返されるべきフィールドのリストを返します。 yii\base\ArrayableTrait
toArray() モデルを配列に変換します。 yii\base\ArrayableTrait

プロテクトメソッド

継承されたメソッドを非表示

メソッド 説明 定義元
extractFieldsFor() 指定されたルートフィールドのフィールドコレクションからネストされたフィールドを抽出します。ネストされたフィールドはドット (.) で区切られます。例:「item.id」前の例では「id」が抽出されます。 yii\base\ArrayableTrait
extractRootFields() ネストされたフィールドからルートフィールド名を抽出します。 yii\base\ArrayableTrait
resolveFields() toArray() によってどのフィールドを返すことができるかを決定します。 yii\base\ArrayableTrait

メソッド詳細

継承されたメソッドを非表示

extraFields() public メソッド

toArray() でさらに展開して返すことができるフィールドのリストを返します。

このメソッドは fields() に似ていますが、このメソッドによって返されるフィールドのリストは、デフォルトでは toArray() によって返されない点が異なります。toArray() を呼び出すときに、展開するフィールド名を明示的に指定した場合のみ、それらの値がエクスポートされます。

デフォルトの実装では、空の配列を返します。

このメソッドをオーバーライドして、コンテキスト情報 (例: 現在のアプリケーションユーザー) に基づいて、展開可能なフィールドのリストを返すことができます。

こちらも参照

public array extraFields ( )
return array

展開可能なフィールド名またはフィールド定義のリスト。返り値の形式については fields() を参照してください。

                public function extraFields()
{
    return [];
}

            
extractFieldsFor() protected メソッド (バージョン 2.0.14 以降利用可能)

指定されたルートフィールドのフィールドコレクションからネストされたフィールドを抽出します。ネストされたフィールドはドット (.) で区切られます。例:「item.id」前の例では「id」が抽出されます。

protected array extractFieldsFor ( array $fields, $rootField )
$fields array

抽出のために要求されたフィールド

$rootField string

ネストされたフィールドを抽出したいルートフィールド

return array

指定されたフィールドに対して抽出されたネストされたフィールド

                protected function extractFieldsFor(array $fields, $rootField)
{
    $result = [];
    foreach ($fields as $field) {
        if (0 === strpos($field, "{$rootField}.")) {
            $result[] = preg_replace('/^' . preg_quote($rootField, '/') . '\./i', '', $field);
        }
    }
    return array_unique($result);
}

            
extractRootFields() protected メソッド (バージョン 2.0.14 以降利用可能)

ネストされたフィールドからルートフィールド名を抽出します。

ネストされたフィールドはドット (.) で区切られます。例:「item.id」前の例では「item」が抽出されます。

protected array extractRootFields ( array $fields )
$fields array

抽出のために要求されたフィールド

return array

指定されたネストされたフィールドから抽出されたルートフィールド

                protected function extractRootFields(array $fields)
{
    $result = [];
    foreach ($fields as $field) {
        $result[] = current(explode('.', $field, 2));
    }
    if (in_array('*', $result, true)) {
        $result = [];
    }
    return array_unique($result);
}

            
fields() public メソッド

特定のフィールドが指定されていない場合に、toArray() によってデフォルトで返されるべきフィールドのリストを返します。

フィールドは、toArray() によって返される配列内の名前付き要素です。

このメソッドは、フィールド名またはフィールド定義の配列を返す必要があります。前者である場合、フィールド名はオブジェクトのプロパティ名として扱われ、その値がフィールド値として使用されます。後者である場合、配列キーはフィールド名であり、配列値は対応するフィールド定義である必要があります。フィールド定義はオブジェクトのプロパティ名または対応するフィールド値を返す PHP の callable のいずれかです。callable のシグネチャは次のようになります。

function ($model, $field) {
    // return field value
}

たとえば、次のコードは 4 つのフィールドを宣言します

  • email: フィールド名はプロパティ名 email と同じです;
  • firstNamelastName: フィールド名はそれぞれ firstNamelastName で、その値は first_name プロパティと last_name プロパティから取得されます。
  • fullName: フィールド名は fullName です。その値は first_namelast_name を連結することで取得されます。
return [
    'email',
    'firstName' => 'first_name',
    'lastName' => 'last_name',
    'fullName' => function () {
        return $this->first_name . ' ' . $this->last_name;
    },
];

このメソッドでは、コンテキスト情報に基づいて異なるフィールドリストを返したい場合もあります。例えば、現在のアプリケーションユーザーの権限に応じて、表示されるフィールドのセットを切り替えたり、特定のフィールドをフィルタリングしたりできます。

このメソッドのデフォルトの実装では、公開オブジェクトのメンバ変数が、それら自身をキーとしてインデックス付けされた状態で返されます。

参考: toArray().

public array fields ( )
return array

フィールド名またはフィールド定義のリスト。

                public function fields()
{
    $fields = array_keys(Yii::getObjectVars($this));
    return array_combine($fields, $fields);
}

            
resolveFields() protected メソッド

toArray() によってどのフィールドを返すことができるかを決定します。

このメソッドは、まず与えられたフィールドからルートフィールドを抽出します。次に、要求されたルートフィールドを、fields() および extraFields() で宣言されたフィールドと比較し、どのフィールドを返すことができるかを判断します。

protected array resolveFields ( array $fields, array $expand )
$fields array

エクスポートが要求されているフィールド。

$expand array

エクスポートが要求されている追加フィールド。

return array

エクスポートされるフィールドのリスト。配列のキーはフィールド名、配列の値は対応するオブジェクトのプロパティ名、またはフィールド値を返すPHPのコールバック関数です。

                protected function resolveFields(array $fields, array $expand)
{
    $fields = $this->extractRootFields($fields);
    $expand = $this->extractRootFields($expand);
    $result = [];
    foreach ($this->fields() as $field => $definition) {
        if (is_int($field)) {
            $field = $definition;
        }
        if (empty($fields) || in_array($field, $fields, true)) {
            $result[$field] = $definition;
        }
    }
    if (empty($expand)) {
        return $result;
    }
    foreach ($this->extraFields() as $field => $definition) {
        if (is_int($field)) {
            $field = $definition;
        }
        if (in_array($field, $expand, true)) {
            $result[$field] = $definition;
        }
    }
    return $result;
}

            
toArray() public メソッド

モデルを配列に変換します。

このメソッドは、まず resolveFields() を呼び出すことで、結果の配列に含めるフィールドを特定します。次に、これらのフィールドを使用してモデルを配列に変換します。$recursive が true の場合、埋め込まれたオブジェクトも配列に変換されます。埋め込まれたオブジェクトが yii\base\Arrayable の場合、それぞれのネストされたフィールドが抽出され、toArray() に渡されます。

モデルが yii\web\Linkable インターフェースを実装している場合、結果の配列には、インターフェースで指定されたリンクのリストを参照する _link 要素も含まれます。

public array toArray ( array $fields = [], array $expand = [], $recursive true )
$fields array

要求されたフィールド。空の場合、または '*' が含まれている場合、fields() で指定されたすべてのフィールドが返されます。フィールドはドット(.)で区切ってネストできます。例: item.field.sub-field ネストされたフィールドを抽出するには、$recursive が true である必要があります。$recursive が false の場合、ルートフィールドのみが抽出されます。

$expand array

エクスポートが要求されている追加フィールド。extraFields() で宣言されたフィールドのみが考慮されます。展開もドット(.)で区切ってネストできます。例: item.expand1.expand2 ネストされた展開を抽出するには、$recursive が true である必要があります。$recursive が false の場合、ルートの展開のみが抽出されます。

$recursive boolean

埋め込まれたオブジェクトの配列表現を再帰的に返すかどうか。

return array

オブジェクトの配列表現。

                public function toArray(array $fields = [], array $expand = [], $recursive = true)
{
    $data = [];
    foreach ($this->resolveFields($fields, $expand) as $field => $definition) {
        $attribute = is_string($definition) ? $this->$definition : $definition($this, $field);
        if ($recursive) {
            $nestedFields = $this->extractFieldsFor($fields, $field);
            $nestedExpand = $this->extractFieldsFor($expand, $field);
            if ($attribute instanceof Arrayable) {
                $attribute = $attribute->toArray($nestedFields, $nestedExpand);
            } elseif ($attribute instanceof \JsonSerializable) {
                $attribute = $attribute->jsonSerialize();
            } elseif (is_array($attribute)) {
                $attribute = array_map(
                    function ($item) use ($nestedFields, $nestedExpand) {
                        if ($item instanceof Arrayable) {
                            return $item->toArray($nestedFields, $nestedExpand);
                        } elseif ($item instanceof \JsonSerializable) {
                            return $item->jsonSerialize();
                        }
                        return $item;
                    },
                    $attribute
                );
            }
        }
        $data[$field] = $attribute;
    }
    if ($this instanceof Linkable) {
        $data['_links'] = Link::serialize($this->getLinks());
    }
    return $recursive ? ArrayHelper::toArray($data) : $data;
}