PHPackages                             nacosvel/transformer - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. nacosvel/transformer

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

nacosvel/transformer
====================

rule-driven data projection and transformation.

v1.1.0(4mo ago)04MITPHPPHP ^8.0

Since Dec 16Pushed 4mo agoCompare

[ Source](https://github.com/nacosvel/transformer)[ Packagist](https://packagist.org/packages/nacosvel/transformer)[ Docs](https://github.com/nacosvel/transformer)[ RSS](/packages/nacosvel-transformer/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (3)Versions (3)Used By (0)

Transformer
===========

[](#transformer)

rule-driven data projection and transformation.

[![GitHub Tag](https://camo.githubusercontent.com/b756572d256558c54b9f23e50abc3cc87cbca195b646f5df812fc7546768c13a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f7461672f6e61636f7376656c2f7472616e73666f726d6572)](https://github.com/nacosvel/transformer/tags)[![Total Downloads](https://camo.githubusercontent.com/72f2d0e41f1be666a76fadc7040aa7232cf309f291b5b06c5dfeb5bca9035431/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6e61636f7376656c2f7472616e73666f726d65723f7374796c653d666c61742d737175617265)](https://packagist.org/packages/nacosvel/transformer)[![Packagist Version](https://camo.githubusercontent.com/deb2c2b167b1addbeee4453ed72f30d38ddb9066ba364f50ccebce7028fedd7f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6e61636f7376656c2f7472616e73666f726d6572)](https://packagist.org/packages/nacosvel/transformer)[![Packagist PHP Version Support](https://camo.githubusercontent.com/8c49277bdfd4475f3e15c1d9a2c533ef0f4036952cc7a4c164e6919ebd7b58b3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6e61636f7376656c2f7472616e73666f726d6572)](https://github.com/nacosvel/transformer)[![Packagist License](https://camo.githubusercontent.com/53bc4b6e8136a96d22bf8ba66fc4f44d84872c49aea28de82b39f2ea593c7632/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6e61636f7376656c2f7472616e73666f726d6572)](https://github.com/nacosvel/transformer)

 Table of Contents1. [Installation](#installation)
2. [Usage](#usage)
3. [Contributing](#contributing)
4. [Contributors](#contributors)
5. [License](#license)

Installation
------------

[](#installation)

You can install the package via [Composer](https://getcomposer.org):

```
composer require nacosvel/transformer
```

\[[back to top](#readme-top)\]

### 规则类说明表

[](#规则类说明表)

规则类型作用适用场景ConditionRule条件规则根据指定条件过滤、筛选或转换数据，仅当满足条件时执行对应的转换逻辑1. 仅对特定状态（如“已支付”）的数据进行转换；
2. 根据字段值范围（如金额&gt;100）调整数据展示；
3. 多分支条件下的差异化数据处理DefaultValueRule默认值规则为字段设置预设默认值，保证数据完整性1. 未填写的用户昵称默认填充为“匿名用户”；
2. 接口返回的空数字字段默认设为0；
3. 缺失的时间字段默认填充为当前时间FieldMappingRule字段映射规则映射源字段与目标字段的名称/值对应关系，实现字段名重命名或值的静态映射1. 第三方接口字段名（如user\_name）映射为本地规范字段（如userName）；
2. 枚举值映射（如1→“男”、2→“女”）；
3. 多数据源字段统一命名InvokeRule调用规则调用自定义方法/函数/服务对字段进行动态转换，支持复杂业务逻辑的嵌入1. 对手机号进行脱敏处理（调用脱敏函数）；
2. 通过用户ID调用用户服务获取用户名；
3. 对金额字段调用汇率转换方法进行币种换算MetadataRule源数据规则基于源数据填充--NestedMappingRule嵌套映射规则处理嵌套结构（如对象、数组）的字段映射，支持多层级数据的转换1. 嵌套对象（如user.address）的字段重命名；
2. 数组内元素的字段映射（如order.items中的price字段）；
3. 多层嵌套数据的扁平化处理WildcardMapperRule通配符映射规则处理数组结构的字段映射，支持多层级数据的转换1. 数组内元素的字段映射；
2. 多层嵌套数据的扁平化处理### Rule Class Description Table

[](#rule-class-description-table)

Rule TypeFunctionApplicable ScenariosConditionRuleFilter, screen or transform data according to specified conditions, and execute the corresponding transformation logic only when the conditions are met1. Transform data only for specific status (e.g., "Paid");
2. Adjust data display according to field value range (e.g., amount &gt; 100);
3. Differentiated data processing under multi-branch conditionsDefaultValueRuleSet default values for fields to ensure data integrity.1. Default fill "Anonymous User" for unfilled user nicknames;
2. Default set empty numeric fields returned by the interface to 0;
3. Default fill missing time fields with current timeFieldMappingRuleMap the name/value correspondence between source fields and target fields to realize field name renaming or static mapping of values1. Map third-party interface field names (e.g., user\_name) to local standard fields (e.g., userName);
2. Enumeration value mapping (e.g., 1→"Male", 2→"Female");
3. Unified naming of multi-data source fieldsInvokeRuleCall custom methods/functions/services to dynamically transform fields, supporting the embedding of complex business logic1. Desensitize mobile phone numbers (call desensitization function);
2. Get username by calling user service via user ID;
3. Convert currency of amount fields by calling exchange rate conversion methodMetadataRuleMetadata-based population--NestedMappingRuleHandle field mapping of nested structures (e.g., objects, arrays) and support transformation of multi-level data1. Field renaming of nested objects (e.g., user.address);
2. Field mapping of elements in arrays (e.g., price field in order.items);
3. Flattening of multi-level nested dataWildcardMapperRuleHandles field mapping in array structures and supports multi-level data transformation.1. Field mapping of elements within an array;
2. Flattening of multi-level nested dataUsage
-----

[](#usage)

```
$originals = [
    'total_fee'           => 9900,
    'intent'              => 'CAPTURE',
    'purchase_units'      => [
        [
            'reference_id' => 'ORD20250520001',
            'amount'       => [
                'currency_code' => 'USD',
                'value'         => '99.00',
            ],
        ],
    ],
    'application_context' => [
        'return_url' => 'https://example.com/pay/return',
        'cancel_url' => 'https://example.com/pay/notify/paypal',
    ],
];

$targets = [];
```

### `Converter::convert`

[](#converterconvert)

```
$response = Converter::convert($originals, [
    $rule = new FieldMappingRule(
        'total_fee',
        'amount',
        fn($value) => $value / 100
    ),
    $rule = new NestedMappingRule(
        'purchase_units.0.amount.currency_code',
        'payment_code',
    ),
    $rule = new WildcardMapperRule([
        'purchase_units_amount'  => [
            'input'     => 'purchase_units.0.amount.value',
            'transform' => fn($v) => $v * 100,
        ],
        'purchase_units_amounts' => 'purchase_units.*.amount.value',
    ]),
], [
    'default_value' => '1234567890',
]);
```

```
{
    "default_value": "1234567890",
    "amount": 99,
    "payment_code": "USD",
    "purchase_units_amount": 9900,
    "purchase_units_amounts": [
        99.00
    ]
}
```

### `ConditionRule::class`

[](#conditionruleclass)

```
use Nacosvel\Transformer\ConditionRule;

$rule = new ConditionRule(
    fn($originals, $targets) => isset($originals['total_fee']),
    function ($originals, $targets) {
        $targets['amount'] = $originals['total_fee'] / 100;
        return $targets;
    }
);
```

```
{
    "amount": 99
}
```

### `DefaultValueRule::class`

[](#defaultvalueruleclass)

```
use Nacosvel\Transformer\DefaultValueRule;

$rule = new DefaultValueRule(
    'trade_type', 'JSAPI'
);
```

```
{
    "trade_type": "JSAPI"
}
```

### `FieldMappingRule::class`

[](#fieldmappingruleclass)

```
use Nacosvel\Transformer\FieldMappingRule;

$rule = new FieldMappingRule(
    'total_fee',
    'amount',
    fn($value) => $value / 100
);
```

```
{
    "amount": 99
}
```

### `InvokeRule::class`

[](#invokeruleclass)

```
use Nacosvel\Transformer\InvokeRule;

$rule = new InvokeRule(function ($originals, $targets) {
    return [
        'amount' => $originals['total_fee'] / 100,
    ];
});
```

```
{
    "amount": 99
}
```

### `NestedMappingRule::class`

[](#nestedmappingruleclass)

```
use Nacosvel\Transformer\NestedMappingRule;

$rule = new NestedMappingRule(
    'purchase_units.0.amount.currency_code',
    'code',
);
```

```
{
    "code": "USD"
}
```

### `WildcardMapperRule::class`

[](#wildcardmapperruleclass)

```
use Nacosvel\Transformer\WildcardMapperRule;

$rule = new WildcardMapperRule([
    'amount'  => [
        'input'     => 'purchase_units.0.amount.value',
        'transform' => fn($v) => $v * 100,
    ],
    'amounts' => 'purchase_units.*.amount.value',
    'default' => [
        'input'     => null,
        'default'   => 'default value',
    ],
]);
```

```
{
    "amount": 9900,
    "amounts": [
        99.00
    ],
    "default": "default value"
}
```

Contributing
------------

[](#contributing)

Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!

1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request

\[[back to top](#readme-top)\]

Contributors
------------

[](#contributors)

Thanks goes to these wonderful people:

[ ![contrib.rocks image](https://camo.githubusercontent.com/5e70bf6867cd7e4854647fb7d0bed824d85ae5ce0d861aa2445b44ae24faf56a/68747470733a2f2f636f6e747269622e726f636b732f696d6167653f7265706f3d6e61636f7376656c2f7472616e73666f726d6572)](https://github.com/nacosvel/transformer/graphs/contributors)Contributions of any kind are welcome!

\[[back to top](#readme-top)\]

License
-------

[](#license)

Distributed under the MIT License (MIT). Please see [License File](https://github.com/nacosvel/transformer/blob/main/LICENSE) for more information.

\[[back to top](#readme-top)\]

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance74

Regular maintenance activity

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

2

Last Release

145d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/2da9b458375a1b7972b7c4d26a5bf8f3e48db305e8805da36f253956f33c5568?d=identicon)[jundayw](/maintainers/jundayw)

---

Top Contributors

[![jundayw](https://avatars.githubusercontent.com/u/16873970?v=4)](https://github.com/jundayw "jundayw (8 commits)")

---

Tags

transformerNacosvel

### Embed Badge

![Health badge](/badges/nacosvel-transformer/health.svg)

```
[![Health](https://phpackages.com/badges/nacosvel-transformer/health.svg)](https://phpackages.com/packages/nacosvel-transformer)
```

###  Alternatives

[yzen.dev/plain-to-class

Class-transformer to transform your dataset into a structured object

16293.9k6](/packages/yzendev-plain-to-class)[jasonlam604/stringizer

Stringizer is a PHP string manipulation library with support for method chaining and multibyte handling

35110.5k1](/packages/jasonlam604-stringizer)[selective/transformer

A strictly typed array transformer with dot-access, fluent interface and filters.

3817.8k1](/packages/selective-transformer)[deefour/transformer

Transform raw input data into consistent, immutable PHP objects

1251.0k2](/packages/deefour-transformer)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
