Skip to content

Replace the middleware Stack with Next - #216

Merged
DavidBadura merged 3 commits into
3.0.xfrom
middleware-next
Oct 6, 2026
Merged

DavidBadura merged 3 commits into
3.0.xfrom
middleware-next

Conversation

@DavidBadura

Copy link
Copy Markdown
Member

Middlewares get a Next instead of the Stack. Instead of $stack->next()->hydrate($metadata, $data, $context, $stack) a middleware now calls $next->hydrate($metadata, $data, $context), so the stack no longer has to be passed along by hand.

Next keeps the position like Stack did, but restores it after every call. A middleware which calls the rest of the stack twice (or retries after an exception) now runs the following middlewares again, with Stack the second call skipped one.

This is a BC break for 3.0, every middleware signature changes from Stack $stack to Next $next. The migration is described in docs/UPGRADE-3.0.md. That file is also added in #215, so whichever is merged second needs a small merge of the two sections.

The TransformMiddleware still ends the stack. Once the transformer from #214 lands in 3.0, Next can call the transformer itself at the end and the TransformMiddleware goes away.

Middlewares had to ask the stack for the next middleware and pass the stack
on again with every call. They now receive Next, which calls the rest of the
stack directly: $next->hydrate($metadata, $data, $context). Next restores its
position after each call, so a middleware can call the rest of the stack more
than once, which skipped middlewares with Stack.
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Hello 👋

here is the most recent benchmark result:

StackHydratorBench
==================

+-------------------------------+-------------------------------------+------------------------------+
|                               | time (kde mode)                     | memory                       |
+-------------------------------+------------------+------------------+-----------------+------------+
| subject                       | Tag: <current>   | Tag: base        | Tag: <current>  | Tag: base  |
+-------------------------------+------------------+------------------+-----------------+------------+
| benchHydrate1Object ()        | 3.200μs (±0.00%) | 3.000μs (±0.00%) | 2.772mb         | 2.772mb    |
| benchExtract1Object ()        | 4.000μs (±0.00%) | 3.800μs (±0.00%) | 2.772mb         | 2.772mb    |
| benchHydrate1000Objects ()    | 2.713ms (±0.00%) | 2.837ms (±0.00%) | 3.052mb         | 3.052mb    |
| benchExtract1000Objects ()    | 3.654ms (±0.00%) | 2.374ms (±0.00%) | 3.020mb         | 3.019mb    |
| benchHydrate1000000Objects () | 1.441s (±0.00%)  | 1.348s (±0.00%)  | 3.052mb         | 3.052mb    |
| benchExtract1000000Objects () | 1.436s (±0.00%)  | 1.357s (±0.00%)  | 3.020mb         | 3.019mb    |
+-------------------------------+------------------+------------------+-----------------+------------+

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

+------------------------------------------+-----------------------------------------+------------------------------+
|                                          | time (kde mode)                         | memory                       |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| subject                                  | Tag: <current>     | Tag: base          | Tag: <current>  | Tag: base  |
+------------------------------------------+--------------------+--------------------+-----------------+------------+
| benchHydrate1Object ()                   | 0.800μs (±0.00%)   | 1.000μs (±0.00%)   | 2.772mb         | 2.772mb    |
| benchHydrate1ObjectTriggerInit ()        | 3.600μs (±0.00%)   | 3.600μs (±0.00%)   | 2.772mb         | 2.772mb    |
| benchHydrate1000Objects ()               | 458.000μs (±0.00%) | 479.000μs (±0.00%) | 2.830mb         | 2.830mb    |
| benchHydrate1000ObjectsTriggerInit ()    | 3.181ms (±0.00%)   | 3.121ms (±0.00%)   | 2.865mb         | 2.865mb    |
| benchHydrate1000000Objects ()            | 279.303ms (±0.00%) | 280.259ms (±0.00%) | 2.830mb         | 2.830mb    |
| benchHydrate1000000ObjectsTriggerInit () | 1.875s (±0.00%)    | 1.855s (±0.00%)    | 2.865mb         | 2.865mb    |
+------------------------------------------+--------------------+--------------------+-----------------+------------+

StackHydratorWithCryptographyBench
==================================

+-------------------------------+---------------------------------------+------------------------------+
|                               | time (kde mode)                       | memory                       |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| subject                       | Tag: <current>    | Tag: base         | Tag: <current>  | Tag: base  |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| benchHydrate1Object ()        | 6.600μs (±0.00%)  | 6.600μs (±0.00%)  | 2.820mb         | 2.820mb    |
| benchExtract1Object ()        | 13.800μs (±0.00%) | 12.800μs (±0.00%) | 2.820mb         | 2.820mb    |
| benchHydrate1000Objects ()    | 4.162ms (±0.00%)  | 4.137ms (±0.00%)  | 3.132mb         | 3.128mb    |
| benchExtract1000Objects ()    | 8.947ms (±0.00%)  | 8.688ms (±0.00%)  | 3.201mb         | 3.201mb    |
| benchHydrate1000000Objects () | 2.068s (±0.00%)   | 1.972s (±0.00%)   | 3.132mb         | 3.128mb    |
| benchExtract1000000Objects () | 6.008s (±0.00%)   | 5.865s (±0.00%)   | 3.201mb         | 3.201mb    |
+-------------------------------+-------------------+-------------------+-----------------+------------+

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

+-------------------------------+-------------------------------------+------------------------------+
|                               | time (kde mode)                     | memory                       |
+-------------------------------+------------------+------------------+-----------------+------------+
| subject                       | Tag: <current>   | Tag: base        | Tag: <current>  | Tag: base  |
+-------------------------------+------------------+------------------+-----------------+------------+
| benchHydrate1Object ()        | 3.200μs (±0.00%) | 3.200μs (±0.00%) | 2.772mb         | 2.772mb    |
| benchExtract1Object ()        | 3.400μs (±0.00%) | 3.800μs (±0.00%) | 2.772mb         | 2.772mb    |
| benchHydrate1000Objects ()    | 2.741ms (±0.00%) | 2.635ms (±0.00%) | 3.052mb         | 3.052mb    |
| benchExtract1000Objects ()    | 2.470ms (±0.00%) | 2.391ms (±0.00%) | 3.020mb         | 3.019mb    |
| benchHydrate1000000Objects () | 1.441s (±0.00%)  | 1.343s (±0.00%)  | 3.052mb         | 3.052mb    |
| benchExtract1000000Objects () | 1.437s (±0.00%)  | 1.358s (±0.00%)  | 3.020mb         | 3.019mb    |
+-------------------------------+------------------+------------------+-----------------+------------+

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

+-------------------------------+---------------------------------------+------------------------------+
|                               | time (kde mode)                       | memory                       |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| subject                       | Tag: <current>    | Tag: base         | Tag: <current>  | Tag: base  |
+-------------------------------+-------------------+-------------------+-----------------+------------+
| benchHydrate1Object ()        | 6.600μs (±0.00%)  | 6.200μs (±0.00%)  | 2.820mb         | 2.820mb    |
| benchExtract1Object ()        | 13.400μs (±0.00%) | 13.200μs (±0.00%) | 2.820mb         | 2.820mb    |
| benchHydrate1000Objects ()    | 4.222ms (±0.00%)  | 4.131ms (±0.00%)  | 3.132mb         | 3.128mb    |
| benchExtract1000Objects ()    | 8.661ms (±0.00%)  | 8.552ms (±0.00%)  | 3.201mb         | 3.201mb    |
| benchHydrate1000000Objects () | 2.066s (±0.00%)   | 1.972s (±0.00%)   | 3.132mb         | 3.128mb    |
| benchExtract1000000Objects () | 5.932s (±0.00%)   | 5.911s (±0.00%)   | 3.201mb         | 3.201mb    |
+-------------------------------+-------------------+-------------------+-----------------+------------+

This comment gets update everytime a new commit comes in!

# Conflicts:
#	docs/UPGRADE-3.0.md
#	tests/Unit/StackHydratorTest.php
@DavidBadura DavidBadura added this to the 3.0.0 milestone Oct 6, 2026
@DavidBadura
DavidBadura merged commit 81e69af into 3.0.x Oct 6, 2026
16 of 17 checks passed
@DavidBadura
DavidBadura deleted the middleware-next branch October 6, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants