トレイト yii\base\ArrayableTrait
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 |
メソッド詳細
toArray() でさらに展開して返すことができるフィールドのリストを返します。
このメソッドは fields() に似ていますが、このメソッドによって返されるフィールドのリストは、デフォルトでは toArray() によって返されない点が異なります。toArray() を呼び出すときに、展開するフィールド名を明示的に指定した場合のみ、それらの値がエクスポートされます。
デフォルトの実装では、空の配列を返します。
このメソッドをオーバーライドして、コンテキスト情報 (例: 現在のアプリケーションユーザー) に基づいて、展開可能なフィールドのリストを返すことができます。
こちらも参照
public array extraFields ( ) | ||
return | array |
展開可能なフィールド名またはフィールド定義のリスト。返り値の形式については fields() を参照してください。 |
---|
public function extraFields()
{
return [];
}
指定されたルートフィールドのフィールドコレクションからネストされたフィールドを抽出します。ネストされたフィールドはドット (.) で区切られます。例:「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);
}
ネストされたフィールドからルートフィールド名を抽出します。
ネストされたフィールドはドット (.) で区切られます。例:「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);
}
特定のフィールドが指定されていない場合に、toArray() によってデフォルトで返されるべきフィールドのリストを返します。
フィールドは、toArray() によって返される配列内の名前付き要素です。
このメソッドは、フィールド名またはフィールド定義の配列を返す必要があります。前者である場合、フィールド名はオブジェクトのプロパティ名として扱われ、その値がフィールド値として使用されます。後者である場合、配列キーはフィールド名であり、配列値は対応するフィールド定義である必要があります。フィールド定義はオブジェクトのプロパティ名または対応するフィールド値を返す PHP の callable のいずれかです。callable のシグネチャは次のようになります。
function ($model, $field) {
// return field value
}
たとえば、次のコードは 4 つのフィールドを宣言します
email
: フィールド名はプロパティ名email
と同じです;firstName
とlastName
: フィールド名はそれぞれfirstName
とlastName
で、その値はfirst_name
プロパティとlast_name
プロパティから取得されます。fullName
: フィールド名はfullName
です。その値はfirst_name
とlast_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);
}
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;
}
モデルを配列に変換します。
このメソッドは、まず 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 ネストされたフィールドを抽出するには、 |
$expand | array |
エクスポートが要求されている追加フィールド。extraFields() で宣言されたフィールドのみが考慮されます。展開もドット(.)で区切ってネストできます。例: item.expand1.expand2 ネストされた展開を抽出するには、 |
$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;
}
コメントするには、サインアップするか、ログインしてください。