Skip to content

add inline normalizer#124

Merged
DavidBadura merged 1 commit into1.15.xfrom
inline-normalizer
Feb 14, 2026
Merged

add inline normalizer#124
DavidBadura merged 1 commit into1.15.xfrom
inline-normalizer

Conversation

@DavidBadura
Copy link
Member

@DavidBadura DavidBadura commented Nov 19, 2025

The InlineNormalizer allows you to define normalization and denormalization logic directly via closures.
This is useful for simple value objects or when you don't want to create a separate normalizer class.

use Patchlevel\Hydrator\Normalizer\InlineNormalizer;

#[InlineNormalizer(
    normalize: static function (self $object): string {
        return $object->toString();
    },
    denormalize: static function (string $value): self {
        return new self($value);
    },
)]
final class Email
{
    public function __construct(
        private string $value
    ) {}

    public function toString(): string
    {
        return $this->value;
    }
}

@github-actions
Copy link

github-actions bot commented Nov 19, 2025

Hello 👋

here is the most recent benchmark result:

HydratorWithLazyBench
=====================

+------------------------------------------+--------------------+--------------------+-----------------+------------+
|                                          | time (kde mode)                         | memory                       |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| subject                                  | Tag: <current>     | Tag: base          | Tag: <current>  | Tag: base  |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| benchHydrate1Object ()                   | 0.600μs (±0.00%)   | 0.800μs (±0.00%)   | 2.770mb         | 3.268mb    |
| benchHydrate1ObjectTriggerInit ()        | 4.200μs (±0.00%)   | 107.000μs (±0.00%) | 2.770mb         | 3.297mb    |
| benchHydrate1000Objects ()               | 439.333μs (±0.00%) | 519.667μs (±0.00%) | 2.808mb         | 3.268mb    |
| benchHydrate1000ObjectsTriggerInit ()    | 3.222ms (±0.00%)   | 3.350ms (±0.00%)   | 2.841mb         | 3.305mb    |
| benchHydrate1000000Objects ()            | 295.549ms (±0.00%) | 309.013ms (±0.00%) | 2.808mb         | 3.268mb    |
| benchHydrate1000000ObjectsTriggerInit () | 2.097s (±0.00%)    | 2.110s (±0.00%)    | 2.841mb         | 2.841mb    |
+------------------------------------------+--------------------+--------------------+-----------------+------------+

HydratorBench
=============

+-------------------------------+------------------+------------------+-----------------+------------+
|                               | time (kde mode)                     | memory                       |
+-------------------------------+------------------+------------------+-----------------+------------+
| subject                       | Tag: <current>   | Tag: base        | Tag: <current>  | Tag: base  |
+-------------------------------+------------------+------------------+-----------------+------------+
| benchHydrate1Object ()        | 3.600μs (±0.00%) | 3.400μs (±0.00%) | 2.770mb         | 2.770mb    |
| benchExtract1Object ()        | 4.400μs (±0.00%) | 4.000μs (±0.00%) | 2.770mb         | 2.770mb    |
| benchHydrate1000Objects ()    | 2.520ms (±0.00%) | 2.485ms (±0.00%) | 2.812mb         | 2.812mb    |
| benchExtract1000Objects ()    | 2.388ms (±0.00%) | 2.328ms (±0.00%) | 2.831mb         | 2.831mb    |
| benchHydrate1000000Objects () | 1.281s (±0.00%)  | 1.299s (±0.00%)  | 2.812mb         | 2.812mb    |
| benchExtract1000000Objects () | 1.305s (±0.00%)  | 1.297s (±0.00%)  | 2.831mb         | 2.831mb    |
+-------------------------------+------------------+------------------+-----------------+------------+

HydratorWithCryptographyBench
=============================

+-------------------------------+-------------------+-------------------+-----------------+------------+
|                               | time (kde mode)                       | memory                       |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| subject                       | Tag: <current>    | Tag: base         | Tag: <current>  | Tag: base  |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| benchHydrate1Object ()        | 7.200μs (±0.00%)  | 7.200μs (±0.00%)  | 2.789mb         | 2.789mb    |
| benchExtract1Object ()        | 10.200μs (±0.00%) | 11.000μs (±0.00%) | 2.789mb         | 2.789mb    |
| benchHydrate1000Objects ()    | 4.623ms (±0.00%)  | 4.625ms (±0.00%)  | 3.011mb         | 3.011mb    |
| benchExtract1000Objects ()    | 5.966ms (±0.00%)  | 5.989ms (±0.00%)  | 2.921mb         | 2.921mb    |
| benchHydrate1000000Objects () | 2.441s (±0.00%)   | 2.459s (±0.00%)   | 3.011mb         | 3.011mb    |
| benchExtract1000000Objects () | 4.244s (±0.00%)   | 4.274s (±0.00%)   | 2.921mb         | 2.921mb    |
+-------------------------------+-------------------+-------------------+-----------------+------------+

This comment gets update everytime a new commit comes in!

@DavidBadura DavidBadura force-pushed the inline-normalizer branch 4 times, most recently from fb2bf2b to bdf4707 Compare November 20, 2025 12:31
@DavidBadura DavidBadura changed the base branch from 1.12.x to 1.15.x February 13, 2026 14:43
@DavidBadura DavidBadura marked this pull request as ready for review February 14, 2026 08:58
@DavidBadura DavidBadura added this to the 1.15.0 milestone Feb 14, 2026
@DavidBadura DavidBadura added the enhancement New feature or request label Feb 14, 2026
@DavidBadura DavidBadura merged commit be34138 into 1.15.x Feb 14, 2026
16 checks passed
@DavidBadura DavidBadura deleted the inline-normalizer branch February 14, 2026 12:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants