Trait yii\base\ArrayableTrait

Implemented byyii\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() 从给定根字段的字段集合中提取嵌套字段. yii\base\ArrayableTrait
extractRootFields() 从嵌套字段中提取根字段名称. yii\base\ArrayableTrait
resolveFields() 确定 toArray() 可以返回哪些字段. yii\base\ArrayableTrait

方法详情

extraFields() public 方法

返回可以进一步扩展并由 toArray() 返回的字段列表.

该方法类似于 fields(), 但默认情况下 toArray() 不返回此方法返回的字段列表. 只有在调用 toArray() 时显式指定要扩展的字段名称时, 才会输出它们的值.

默认实现返回一个空数组.

你可以重写此方法, 以根据某些上下文信息(eg. 当前应用程序用户)返回可扩展字段的列表.

参见:

public array extraFields ( )
return array

可扩展字段名称或字段定义的列表. 返回值的格式请参考的 fields().

extractFieldsFor() protected 方法 (可用自版本: 2.0.14)

从给定根字段的字段集合中提取嵌套字段.

嵌套字段用点(.)分隔. 例如: "item.id", 会提取"id".

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

要求提取的字段.

$rootField string

我们要为其提取嵌套字段的根字段.

return array

为给定字段提取的嵌套字段.

extractRootFields() protected 方法 (可用自版本: 2.0.14)

从嵌套字段中提取根字段名称.

嵌套字段用点(.)分隔. 例如: item.id, 会提取item.

protected array extractRootFields ( array $fields )
$fields array

要求提取的字段.

return array

从给定的嵌套字段中提取的根字段.

fields() public 方法

返回未指定任何特定字段时, 默认应由 toArray() 返回的字段列表.

字段是 toArray() 返回数组中的已命名元素.

此方法应返回字段名称或字段定义的数组. 如果是前者, 则字段名称将被视为对象属性名称, 其值将用作字段值. 如果是后者, 则数组键应为字段名称, 而数组值应为相应的字段定义, 该定义可以是对象属性名称, 也可以是返回相应字段值的 PHP 可调用对象. 可调用的签名应该是:

function ($model, $field) {
    // 返回字段值
}

例如, 以下代码声明了四个字段:

  • email: 字段名称与属性名称email相同;
  • firstNamelastName: 字段名称是firstNamelastName, 它们的值是从first_namelast_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

字段名称或字段定义的列表.

resolveFields() protected 方法

确定 toArray() 可以返回哪些字段.

此方法将首先从给定字段中提取根字段. 然后, 它将根据 fields()extraFields() 中声明的字段检查请求的根字段, 以确定可以返回哪些字段.

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

要求输出的字段.

$expand array

要求输出的其它字段.

return array

要输出的字段列表. 数组键是字段名称, 数组值是相应的对象属性名称或返回字段值的 PHP 可调用对象.

toArray() public 方法

将模型转换为数组.

该方法将首先通过调用 resolveFields() 标识要包含在结果数组中的字段. 然后它将模型转换成具有这些字段的数组. 如果$recursivetrue, 则任何嵌入的对象也将转换为数组. 当嵌入的对象是 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嵌套字段才能被提取. 如果$recursivefalse, 则仅提取根字段.

$expand array

要求输出的其它字段. 仅考虑在 extraFields() 中声明的字段. 扩展也可以嵌套, 用点(.)分割. 例如: item.expand1.expand2. $recursive必须为true嵌套扩展才能被提取. 如果$recursivefalse, 则仅提取根扩展名.

$recursive boolean

是否递归返回嵌入式对象的数组表示形式.

return array

对象的数组表示形式.