PHPackages                             saasformation/magic-field - 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. saasformation/magic-field

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

saasformation/magic-field
=========================

MagicField is a library to convert mixed values into desired typed values -when doable.

1.0.4(1y ago)02131MITPHP

Since Apr 3Pushed 1y agoCompare

[ Source](https://github.com/SaaSFormationCOM/magic-field)[ Packagist](https://packagist.org/packages/saasformation/magic-field)[ RSS](/packages/saasformation-magic-field/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (5)Dependencies (1)Versions (6)Used By (1)

MagicField
==========

[](#magicfield)

FieldMagic is a library to convert mixed values into desired typed values -when doable.

It is very useful, for instance, when reading JSON body requests in controllers.

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

[](#installation)

Use composer to require the library:

```
composer require saasformation/field-magic
```

Getting started
---------------

[](#getting-started)

Let's imagine you have the following array with data (maybe from a json\_decode call):

```
$data = [
    'name' => 'John',
    'birthdate' => '1990-02-03',
    'height' => 177,
    'alive' => true,
    'highSchoolQualificationsAverage' => 4.56,
    'professions' => [
        'computing engineer',
        'soldier'
    ]
];
```

Now, you can do the following:

```
$name = (new StandardField($data['name']))->string();
$birthdate = (new StandardField($data['birthdate']))->datetime();
$height = (new StandardField($data['height']))->integer();
$alive = (new StandardField($data['alive']))->boolean();
$highSchoolQualificationsAverage = (new StandardField($data['highSchoolQualificationsAverage']))->float();
$professions = (new StandardField($data['professions']))->array();
```

Two advantages:

1. You now have the value typed.
2. If any of the source values were not compatible with type changing, an InvalidConversionException would be thrown.

If you were going to get data from a JSON body request in a controller, you could do something as cool as this:

```
abstract class BaseController {
    protected function field(string $path): StandardField {
        return new StandardField($this->getFromBodyRequestByPath($path));
    }
}

class Controller extends BaseController {
    public function doSomething(): Response {
        $this->commandBus->handle(
            new CreatePersonCommand(
                $this->field('data.attributes.name')->string(),
                $this->field('data.attributes.birthdate')->datetime(),
                $this->field('data.attributes.height')->integer(),
                $this->field('data.attributes.alive')->boolean(),
                $this->field('data.attributes.highSchoolQualificationsAverage')->float(),
                $this->field('data.attributes.professions')->array(),
            )
        )
    }
}
```

Adding a new converter
----------------------

[](#adding-a-new-converter)

Sometimes you don't have enough with the StandardField converters available.

To add a new one, you have to create a new trait:

```
trait MyConverterCapable {
    public function addOneToInteger(): integer {
        return (int)$this->value + 1;
    }
}
```

Bear in mind `$this->value` is a mixed value, so for production proposes you may validate data better than in this example.

Now, you need to create a new Field class. If you want to have all the StandardField converters also available, you can inherit from StandardField. If not, directly from Field:

```
class MyConverterField extends StandardField
{
    use MyConverterCapable;
}
```

Now you can just use the new Field based class the same way as the StandardField one:

```
$addedInteger = (new MyConverterField(1)->addOneToInteger(); // 2
```

Users of stratdes/vo
--------------------

[](#users-of-stratdesvo)

Users of [stratdes/vo](https://github.com/stratdes/vo) may find [saasformation/vo-magic-field-bridge](https://github.com/SaaSFormationCOM/vo-magic-field-bridge) useful to add converters for single VO's and collections.

Issues
------

[](#issues)

If you find some issue in the library, please feel free to open an issue here on Github.

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity11

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity52

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

Total

5

Last Release

533d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/6607762?v=4)[Alex Hernandez](/maintainers/stratdes)[@stratdes](https://github.com/stratdes)

---

Top Contributors

[![stratdes](https://avatars.githubusercontent.com/u/6607762?v=4)](https://github.com/stratdes "stratdes (7 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/saasformation-magic-field/health.svg)

```
[![Health](https://phpackages.com/badges/saasformation-magic-field/health.svg)](https://phpackages.com/packages/saasformation-magic-field)
```

PHPackages © 2026

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