PHPackages                             dobrosite/php-mapping - 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. dobrosite/php-mapping

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

dobrosite/php-mapping
=====================

Отображение данных на структуры PHP

0.9.1(3y ago)03.0kMITPHPPHP ^8.1

Since Aug 19Pushed 2y ago1 watchersCompare

[ Source](https://github.com/dobrosite/php-mapping)[ Packagist](https://packagist.org/packages/dobrosite/php-mapping)[ RSS](/packages/dobrosite-php-mapping/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (13)Versions (20)Used By (0)

Отображение данных на структуры PHP
===================================

[](#отображение-данных-на-структуры-php)

Библиотека компонентов для отображения структурированных данных на структуры PHP и обратно.

Основная идея библиотеки — предоставить «кирпичики» из которых можно построить свои правила отображения данных для любой ситуации.

Определения
-----------

[](#определения)

- **Входные данные** (**input**) — структурированные данные, которые требуется отобразить на структуры PHP.
- **Выходные данные** (**output**) — структурированные данные, получаемые из структур PHP.
- **Массив** (**array**) — этим словом в библиотеке обозначаются **только ассоциативные массивы**.
- **Коллекция** (**collection**) — индексированный (неассоциативный) массив однотипных значений.

Основы
------

[](#основы)

Сердцем библиотеки являются интерфейсы `*Mapper`:

### Mapper

[](#mapper)

Пустой интерфейс, который реализуют все преобразователи.

### InputMapper

[](#inputmapper)

Преобразователь входных данных. Содержит единственный метод:

```
public function input(mixed $source): mixed;
```

### OutputMapper

[](#outputmapper)

Преобразователь выходных данных. Содержит единственный метод:

Отображает входные данные `$source` на структуру PHP и возвращает её.

```
public function output(mixed $source): mixed;
```

### BidirectionalMapper

[](#bidirectionalmapper)

Объединяет в себе `InputMapper` и `OutputMapper`.

Примеры
-------

[](#примеры)

`TODO`

BidirectionalMapper
-------------------

[](#bidirectionalmapper-1)

### Apply

[](#apply)

Применяет ко входным данным преобразователь, полученный от другого преобразователя.

```
use DobroSite\Mapping;

$mapper = new Mapping\Apply(
  input: new Mapping\Callback(
    input: fn(mixed $source) => is_numeric($source) ? new Mapping\FloatType() : new Mapping\AsIs(),
    output: fn(mixed $source) => is_float($source) ? new Mapping\FloatType() : new Mapping\AsIs(),
  )
);

$mapper->input('123.45'); // 123.45
$mapper->input('foo'); // 'foo'
```

### ArrayKeys

[](#arraykeys)

Применяет указанное преобразование последовательно к каждому ключу ассоциативного массива.

```
use DobroSite\Mapping;

$mapper = new Mapping\ArrayKeys(
  new Mapping\Callback(
    input: strtolower(...),
    output: strtoupper(...),
  ),
);

$mapper->input(['FOO' => 'foo value', 'BAR' => 'bar value']);
// ['foo' => 'foo value', 'bar' => 'bar value']

$mapper->output(['foo' => 'foo value', 'bar' => 'bar value']);
// ['FOO' => 'foo value', 'BAR' => 'bar value']
```

### ArrayKeysMap

[](#arraykeysmap)

Меняет имена ключей массива на основе карты соответствия.

```
use DobroSite\Mapping;

$mapper = new Mapping\ArrayKeysMap([
  'FOO' => 'foo',
  'BAR' => 'bar',
]);

$mapper->input(['FOO' => 'foo value', 'BAR' => 'bar value']);
// ['foo' => 'foo value', 'bar' => 'bar value']

$mapper->output(['foo' => 'foo value', 'bar' => 'bar value']);
// ['FOO' => 'foo value', 'BAR' => 'bar value']
```

### ArrayValues

[](#arrayvalues)

Применяет преобразования к указанным значениям ассоциативного массива.

```
use DobroSite\Mapping;

$mapper = new Mapping\ArrayValues([
  'active' => new Mapping\BooleanType('yes', 'no'),
]);

$mapper->input(['active' => 'yes']); // ['active' => true]
$mapper->output(['active' => true]); // ['active' => 'yes']
```

### AsIs

[](#asis)

Оставляет значения как они есть.

```
use DobroSite\Mapping;

$mapper = new Mapping\AsIs();
$mapper->input('foo'); // 'foo'
$mapper->output('foo'); // 'foo'
```

### BooleanType

[](#booleantype)

Преобразовывает значение в булев тип.

```
use DobroSite\Mapping;

$mapper = new Mapping\BooleanType();
$mapper->input('true'); // true
$mapper->output(true); // 'true'

$mapper = new Mapping\BooleanType(true: 'да', false: 'нет');
$mapper->input('Нет'); // false
$mapper->output(false); // 'нет'
```

### Callback

[](#callback)

Позволяет использовать для преобразования функции обратного вызова.

```
use DobroSite\Mapping;

$mapper = new Mapping\Callback(
  input: strtolower(...),
  output: strtoupper(...),
);

$mapper->input('FOO'); // 'foo'
$mapper->output('foo'); // 'FOO'
```

### Chained

[](#chained)

Создаёт цепочку преобразований, выполняемых последовательно: в `input` от первого к последнему, в `output` — в обратном порядке.

```
use DobroSite\Mapping;

$mapper = new Mapping\Chained(
  $mapper1,
  $mapper2,
  // …
);
```

### Collection

[](#collection)

Применяет указанный преобразователь к каждому элементу коллекции.

```
use DobroSite\Mapping;

$mapper = new Mapping\Collection(
  new Mapping\FloatType(),
);

$mapper->input(['123.45', '67.89']); // [123.45, 67.89]
```

### Constant

[](#constant)

Возвращает константное значение.

```
use DobroSite\Mapping;

$mapper = new Mapping\Constant(input: 'foo', output: 'bar');
$mapper->input(uniqid()); // 'foo'
$mapper->output(uniqid()); // 'bar'
```

### Constructor

[](#constructor)

Отображает массив на объект, используя для создания объекта конструктор его класса.

*Подробнее см. «Работа с объектами» ниже.*

В качестве аргумента `$class` в конструктор `Constructor` следует передать имя класса или экземпляр `Mapper`, который вернёт имя класса создаваемого объекта.

```
use App\Foo;
use DobroSite\Mapping;

$mapper = new Mapping\Constructor(Foo::class);
$instanceOfFoo = $mapper->input(['foo' => 'foo value']);
```

```
use App\Foo;
use App\Bar;
use DobroSite\Mapping;

$mapper = new Mapping\ObjectConstructor(
  Mapping\Callback(
    fn(array $properties) => array_key_exists('bar', $properties) ? Bar::class : Foo::class,
  )
);

$instanceOfFoo = $mapper->input(['foo' => 'foo value']);
$instanceOfBar = $mapper->input(['bar' => 'bar value']);
```

### EnumType

[](#enumtype)

Преобразовывает значения перечисляемых типов.

```
use App\SomeEnum;
use DobroSite\Mapping;

$mapper = new Mapping\EnumType(SomeEnum::class);
$mapper->input('foo'); // SomeEnum::Foo
$mapper->output(SomeEnum::Foo); // 'foo'
```

### FloatType

[](#floattype)

Преобразовывает значение в вещественное число.

```
use DobroSite\Mapping;

$mapper = new Mapping\FloatType();
$mapper->input('1234.56'); // 1_234.56

$mapper = new Mapping\FloatType(
  new \NumberFormatter('ru_RU', \NumberFormatter::DEFAULT_STYLE)
);
$mapper->input('1 234,56'); // 1_234.56
```

### Map

[](#map)

Преобразовывает значение на основе карты (ассоциативного массива).

```
use DobroSite\Mapping;

$mapper = new Mapping\Map(['foo' => 'bar']);
$mapper->input('foo'); // 'bar'
$mapper->output('bar'); // 'foo'
```

### Nullable

[](#nullable)

Модификатор для других преобразователей, разрешающий им принимать значение `null`.

```
use DobroSite\Mapping;

$float = new Mapping\FloatType();
$nullable = new Mapping\Nullable($float);

$nullable->input('123'); // 123
$nullable->input(null); // NULL
$float->input(null); // → InvalidArgumentException
```

### ObjectFactory

[](#objectfactory)

Отображает массив на объект, используя для создания объекта фабрику.

*Подробнее см. «Работа с объектами» ниже.*

В качестве аргумента `$factory` в конструктор `ObjectFactory` следует передать фабрику для создания нужных объектов.

```
use DobroSite\Mapping;

$mapper = new Mapping\ObjectFactory('\App\factory_function');
$mapper = new Mapping\ObjectFactory(factory_function(...));
$mapper = new Mapping\ObjectFactory([Factory::class, 'staticMethod']);
$mapper = new Mapping\ObjectFactory([$factory, 'method']);
$mapper = new Mapping\ClassType\CallableObjectFactory(
  fn(string $foo, string $bar) => new SomeClass($foo, $bar)
);
```

### ObjectMapper

[](#objectmapper)

Комбинирующий преобразователь, объединяющий `InputMapper` и `OutputMapper` для преобразования массив ⇆ объект.

В первом аргументе (`input`) следует передать экземпляр `InputMapper`, создающий объект из массива, например, [Constructor](#Constructor) или [ObjectFactory](#ObjectFactory).

Во втором аргументе (`output`) можно передать экземпляр `OutputMapper`, создающий массив из объекта. Если аргумент не указан, будет использован [PublicProperties](#PublicProperties).

```
use DobroSite\Mapping;

$mapper = new Mapping\ObjectMapper(
  input: new Mapping\Constructor(Foo::class),
);
```

InputMapper
-----------

[](#inputmapper-1)

### ArrayDefaults

[](#arraydefaults)

Позволяет задать значения по умолчанию для ключей, отсутствующих во входном массиве.

```
use DobroSite\Mapping;

$mapper = new Mapping\ArrayDefaults([
  'bar' => 'bar value',
]);

$mapper->input(['foo' => 'foo value']);
// ['foo' => 'foo value', 'bar' => 'bar value']
```

OutputMapper
------------

[](#outputmapper-1)

### Merge

[](#merge)

Принимает в конструкторе несколько экземпляров `OutputMapper`. При вызове метода `output` поочерёдно передаёт полученное значение каждому из преобразователей, затем объединяет возвращённые ими результаты с помощью `array_merge`.

```
use DobroSite\Mapping;

$mapper = new Mapping\Merge(
 new Mapping\Constant(output: ['bar' => 'BAR']),
 new Mapping\Constant(output: ['baz' => 'BAZ']),
);

$mapper->output(['foo' => 'FOO']);
// ['foo' => 'FOO', 'bar' => 'BAR', 'baz' => 'BAZ']
```

### PublicProperties

[](#publicproperties)

Принимает на входе объект, возвращает на выходе ассоциативный массив его публичных свойств. Предназначен для использования в `ObjectMapper`.

Работа с объектами
------------------

[](#работа-с-объектами)

`TODO`

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity16

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity55

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 ~2 days

Recently: every ~9 days

Total

19

Last Release

1316d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f59cdbde66f36f1f86dad783d2f79e64c17ffdcd0771f73b96b7d9d7ee37b364?d=identicon)[Mekras](/maintainers/Mekras)

---

Top Contributors

[![mekras](https://avatars.githubusercontent.com/u/192067?v=4)](https://github.com/mekras "mekras (59 commits)")

---

Tags

php

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/dobrosite-php-mapping/health.svg)

```
[![Health](https://phpackages.com/badges/dobrosite-php-mapping/health.svg)](https://phpackages.com/packages/dobrosite-php-mapping)
```

###  Alternatives

[imanghafoori/laravel-anypass

A minimal yet powerful package to help you in development.

21421.6k](/packages/imanghafoori-laravel-anypass)

PHPackages © 2026

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