PHPackages                             maximaster/jaft - 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. [API Development](/categories/api)
4. /
5. maximaster/jaft

ActiveLibrary[API Development](/categories/api)

maximaster/jaft
===============

league/fractal universal JSON:API transformer.

v1.0.0(1y ago)03MITPHP

Since Sep 3Pushed 1y ago2 watchersCompare

[ Source](https://github.com/maximaster/jaft)[ Packagist](https://packagist.org/packages/maximaster/jaft)[ RSS](/packages/maximaster-jaft/feed)WikiDiscussions master Synced 1w ago

READMEChangelogDependencies (7)Versions (2)Used By (0)

maximaster/jaft
===============

[](#maximasterjaft)

Universal JSON:API [league/fractal](https://packagist.org/packages/league/fractal) transformer for your objects.

```
composer require maximaster/jaft
```

Why?
----

[](#why)

According to [league/fractal](https://packagist.org/packages/league/fractal)manual page about [Transformers](https://fractal.thephpleague.com/transformers/)you should create a transformer per object type. That's a lot of routine work.

Or just configure universal `Maximaster\Jaft\Jaft` transformer and you are ready to go.

Example
-------

[](#example)

**services.yaml**

```
services:
    Maximaster\Jaft\Contract\Mapper:
        alias: 'api_mapper'

    api_mapper:
        class: Maximaster\Jaft\Mapper\DefaultMapper
        arguments:
            - '@api_output_manager'
            - '@api_transformer'
            - '@api_naming_provider'

    api_output_manager:
        class: League\Fractal\Manager
        arguments:
            - '@api_scope_factory'
        calls:
            -   setSerializer: [ '@api_serializer' ]

    api_serializer:
        class: Maximaster\Jaft\Serializer\JsonApiSerializer
        arguments:
            - ''
            - null

    api_scope_factory:
        class: League\Fractal\ScopeFactory

    api_transformer:
        class: Maximaster\Jaft\Jaft
        arguments:
            - '@api_schema_repository'
            - '@api_data_extractor'
            - '@api_naming_provider'
            - '@api_formatter'
            - null

    api_schema_repository:
        class: Maximaster\Jaft\SchemaRepository\PropertyInfoSchemaRepository
        arguments:
            - '@api_property_info_extractor'
            - '@api_naming_provider'
            - '@api_identity_locator'
            - '@api_type_converter'
            -
                - 'Project\Process\UserManagement\Domain\ValueObject\UserTimestamp'
                - 'Project\Process\DatabaseManagement\Domain\Entry\Field\NativeValueMap'
            -
                - 'Bitrix\Main\Type\DateTime'

    api_property_info_extractor:
        class: Symfony\Component\PropertyInfo\PropertyInfoExtractor
        arguments:
            - [ '@api_static_property_lister', '@api_packed_embeddable_property_lister', '@api_default_property_lister' ]
            - [ '@api_packed_embeddable_type_extractor', '@Maximaster\Jaft\PropertyTypeExtractor\ReplacedPropertyTypeExtractor', '@api_property_phpdoc_extractor', '@api_property_reflection_extractor' ]
            - [ '@api_property_phpdoc_extractor', '@api_property_reflection_extractor' ]
            - [ '@api_property_phpdoc_extractor', '@api_property_reflection_extractor' ]
            - [ '@api_property_phpdoc_extractor', '@api_property_reflection_extractor' ]

    api_static_property_lister:
        class: Maximaster\Jaft\PropertyListExtractor\StaticPropertyListExtractor
        arguments:
            - Project\Process\System\Domain\ValueObject\EntityRef: ['id']
              Project\Process\System\Domain\ValueObject\LabeledEntityRef: ['id', 'label']
              Project\Process\System\Domain\Contract\Ref: ['id']

    Maximaster\Jaft\PropertyTypeExtractor\ReplacedPropertyTypeExtractor:
        arguments:
            $realExtractor: '@api_property_phpdoc_extractor'
            $map: '%orm_entity_map%'

    api_packed_embeddable_property_lister:
        class: Maximaster\Jaft\PropertyListExtractor\PackedEmbeddablePropertyListExtractor

    api_default_property_lister:
        class: Maximaster\Jaft\PropertyListExtractor\AccessorPropertyListExtractor

    api_packed_embeddable_type_extractor:
        class: Maximaster\Jaft\PropertyTypeExtractor\PackedEmbeddablePropertyTypeExtractor

    api_property_phpdoc_extractor:
        class: Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor
        arguments:
            - null
            - null
            - [ '' ]

    api_property_reflection_extractor:
        class: Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor
        arguments:
            - [ ]
            - [ '' ]

    api_naming_provider:
        class: Project\Process\System\IO\OpenApi\OpenApiNamingProvider
        arguments:
            - '@api_fcqn_naming_provider'
            - !tagged_iterator project.open_api.overlay_naming_provider

    api_fcqn_naming_provider:
        class: Maximaster\Jaft\NamingProvider\FqcnNamingProvider
        arguments:
            - '%%3$s-%%s'
            - '@api_type_case_converter'

    api_identity_locator:
        class: Project\Process\System\IO\OpenApi\IdentityLocator\EntityIdentityLocator

    api_type_converter:
        class: Maximaster\Jaft\TypeConverter\PropertyInfoTypeConverter

    api_type_case_converter:
        class: Maximaster\Jaft\CaseConverter\JawiraCaseConverter
        arguments:
            - 'pascal'
            - 'kebab'

    api_data_extractor:
        class: Maximaster\Jaft\DataExtractor\PropertyAccessorDataExtractor
        arguments:
            - '@api_schema_repository'
            - '@api_property_accessor'

    api_property_accessor:
        class: Project\Process\System\IO\OpenApi\PropertyAccessor\CacheablePropertyAccessor
        arguments:
            $realAccessor: '@api_property_accessor_worker'

    api_property_accessor_worker:
        class: Project\Process\System\IO\OpenApi\PropertyAccessor\GetterPropertyAccessor
        arguments:
            $fallback: '@api_property_accessor_fallback'

    api_property_accessor_fallback:
        class: Symfony\Component\PropertyAccess\PropertyAccessor
        arguments:
            - !php/const Symfony\Component\PropertyAccess\PropertyAccessor::MAGIC_GET
            - false
            - null
            - true
            - '@api_property_reflection_extractor'

    api_formatter:
        class: Maximaster\Jaft\ObjectFormatter\AtoaObjectFormatter
        arguments:
            - '@api_formatter_converter'

    api_formatter_converter:
        class: Maximaster\Atoa\Converter
        arguments:
            - !tagged_iterator project.open_api.formatter

    api_property_name_converter:
        class: Maximaster\Jaft\CaseConverter\JawiraCaseConverter
        arguments:
            - 'auto'
            - 'camel'
```

###  Health Score

22

—

LowBetter than 21% of packages

Maintenance31

Infrequent updates — may be unmaintained

Popularity3

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity40

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

Unknown

Total

1

Last Release

713d ago

### Community

Maintainers

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

---

Top Contributors

[![mlavrinenko](https://avatars.githubusercontent.com/u/15840214?v=4)](https://github.com/mlavrinenko "mlavrinenko (1 commits)")

### Embed Badge

![Health badge](/badges/maximaster-jaft/health.svg)

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

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k6.0M777](/packages/sylius-sylius)[veewee/xml

XML without worries

1837.3M39](/packages/veewee-xml)[rector/rector-src

Instant Upgrade and Automated Refactoring of any PHP code

136411.0k14](/packages/rector-rector-src)[tomaj/nette-api

Nette api

36276.9k8](/packages/tomaj-nette-api)[ahmed-bhs/doctrine-doctor

Runtime analysis tool for Doctrine ORM integrated into Symfony Web Profiler. Unlike static linters, it analyzes actual query execution at runtime to detect performance bottlenecks, security vulnerabilities, and best practice violations during development with real execution context and data.

12413.3k](/packages/ahmed-bhs-doctrine-doctor)[storyblok/php-content-api-client

PHP Client for Storyblok Content API

11189.5k15](/packages/storyblok-php-content-api-client)

PHPackages © 2026

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