Skip to content

Allow event tags on methods - #926

Merged
DavidBadura merged 1 commit into
4.0.xfrom
event-tag-methods
Oct 3, 2026
Merged

DavidBadura merged 1 commit into
4.0.xfrom
event-tag-methods

Conversation

@DavidBadura

Copy link
Copy Markdown
Member

#[EventTag] only worked on properties, so a tag that combines several values had to be stored as an extra property on the event. That gets annoying for patterns like closing the books, where events are tagged with their period (e.g. account-period:1/2026) and the period is derived from data the event already has.

The attribute can now also be put on methods:

#[EventTag(prefix: 'account-period')]
public function accountPeriod(): string
{
    return $this->accountId . '/' . $this->bookedAt->format('Y');
}

The return value is handled like a property value, so arrays, null, prefix and hash work the same way. Non-public methods are supported too. A method with required parameters or an invalid return value throws an EventTagExtractorError.

#[EventTag] only worked on properties, so a tag that combines several values,
like an account and a booking period, had to be stored as an extra property.

The attribute can now be put on methods without required parameters. The
return value is handled like a property value, including arrays and null.
@DavidBadura DavidBadura added this to the 4.0.0 milestone Oct 3, 2026
@DavidBadura DavidBadura added the enhancement New feature or request label Oct 3, 2026
@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown

Hello 👋

here is the most recent benchmark result:

SplitStreamBench
================

+-------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                         | time (kde mode)                                     | memory                                     |
+-------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                 | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+-------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchLoad10000Events () | 2.654ms (±0.00%)   | 2.965ms (±0.00%)   | -10.51%   | 35.774mb        | 36.295mb   | -1.43%      |
| benchSave10000Events () | 463.656ms (±0.00%) | 481.680ms (±0.00%) | -3.74%    | 35.909mb        | 35.909mb   | 0.00%       |
+-------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

SimpleSetupTaggableStoreBench
=============================

+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                                        | time (kde mode)                                     | memory                                     |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                                | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchLoad1Event ()                     | 1.055ms (±0.00%)   | 1.069ms (±0.00%)   | -1.24%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchLoad10000Events ()                | 72.239ms (±0.00%)  | 78.280ms (±0.00%)  | -7.72%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchSave1Event ()                     | 1.744ms (±0.00%)   | 1.737ms (±0.00%)   | +0.41%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchSave10000Events ()                | 304.139ms (±0.00%) | 309.523ms (±0.00%) | -1.74%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchSave10000Aggregates ()            | 10.078s (±0.00%)   | 10.093s (±0.00%)   | -0.15%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchSave10000AggregatesTransaction () | 7.072s (±0.00%)    | 7.036s (±0.00%)    | +0.51%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchAppend1Event ()                   | 1.664ms (±0.00%)   | 1.656ms (±0.00%)   | +0.51%    | 36.312mb        | 36.312mb   | 0.00%       |
| benchAppend100Events ()                | 8.220ms (±0.00%)   | 8.288ms (±0.00%)   | -0.82%    | 36.312mb        | 36.312mb   | 0.00%       |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

SubscriptionEngineBench
=======================

+---------------------------+-----------------+-----------------+-----------+-----------------+------------+-------------+
|                           | time (kde mode)                               | memory                                     |
+---------------------------+-----------------+-----------------+-----------+-----------------+------------+-------------+
| subject                   | Tag: <current>  | Tag: base       | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+---------------------------+-----------------+-----------------+-----------+-----------------+------------+-------------+
| benchHandle10000Events () | 3.431s (±0.00%) | 3.421s (±0.00%) | +0.29%    | 48.301mb        | 48.301mb   | 0.00%       |
+---------------------------+-----------------+-----------------+-----------+-----------------+------------+-------------+

NoopSubscriptionEngineBench
===========================

+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                           | time (kde mode)                                     | memory                                     |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                   | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchHandle10000Events () | 106.829ms (±0.00%) | 109.134ms (±0.00%) | -2.11%    | 48.301mb        | 48.301mb   | 0.00%       |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

SimpleSetupStreamStoreBench
===========================

+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                                        | time (kde mode)                                     | memory                                     |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                                | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchLoad1Event ()                     | 1.279ms (±0.00%)   | 1.265ms (±0.00%)   | +1.10%    | 35.146mb        | 35.146mb   | 0.00%       |
| benchLoad10000Events ()                | 73.405ms (±0.00%)  | 77.274ms (±0.00%)  | -5.01%    | 35.146mb        | 35.146mb   | 0.00%       |
| benchSave1Event ()                     | 1.632ms (±0.00%)   | 1.619ms (±0.00%)   | +0.83%    | 35.146mb        | 35.146mb   | 0.00%       |
| benchSave10000Events ()                | 283.951ms (±0.00%) | 287.435ms (±0.00%) | -1.21%    | 35.146mb        | 35.146mb   | 0.00%       |
| benchSave10000Aggregates ()            | 9.988s (±0.00%)    | 9.939s (±0.00%)    | +0.50%    | 35.146mb        | 35.146mb   | 0.00%       |
| benchSave10000AggregatesTransaction () | 6.984s (±0.00%)    | 6.957s (±0.00%)    | +0.38%    | 35.147mb        | 35.147mb   | 0.00%       |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

SubscriptionEngineBatchBench
============================

+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                           | time (kde mode)                                     | memory                                     |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                   | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchHandle10000Events () | 113.288ms (±0.00%) | 118.173ms (±0.00%) | -4.13%    | 35.726mb        | 35.726mb   | 0.00%       |
+---------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

PersonalDataBench
=================

+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
|                                        | time (kde mode)                                     | memory                                     |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| subject                                | Tag: <current>     | Tag: base          | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+
| benchLoad1Event ()                     | 853.400μs (±0.00%) | 855.400μs (±0.00%) | -0.23%    | 37.008mb        | 37.008mb   | 0.00%       |
| benchLoad10000Events ()                | 227.314ms (±0.00%) | 217.640ms (±0.00%) | +4.44%    | 37.008mb        | 37.008mb   | 0.00%       |
| benchSave1Event ()                     | 2.321ms (±0.00%)   | 2.318ms (±0.00%)   | +0.13%    | 37.008mb        | 37.008mb   | -0.00%      |
| benchSave10000Events ()                | 469.449ms (±0.00%) | 463.004ms (±0.00%) | +1.39%    | 37.063mb        | 37.063mb   | 0.00%       |
| benchSave10000Aggregates ()            | 15.301s (±0.00%)   | 15.267s (±0.00%)   | +0.23%    | 37.008mb        | 37.008mb   | 0.00%       |
| benchSave10000AggregatesTransaction () | 12.178s (±0.00%)   | 12.239s (±0.00%)   | -0.50%    | 37.008mb        | 37.008mb   | -0.00%      |
+----------------------------------------+--------------------+--------------------+-----------+-----------------+------------+-------------+

SnapshotsBench
==============

+----------------------------------------+-------------------+-------------------+-----------+-----------------+------------+-------------+
|                                        | time (kde mode)                                   | memory                                     |
+----------------------------------------+-------------------+-------------------+-----------+-----------------+------------+-------------+
| subject                                | Tag: <current>    | Tag: base         | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+----------------------------------------+-------------------+-------------------+-----------+-----------------+------------+-------------+
| benchLoad10000EventsMissingSnapshot () | 72.459ms (±0.00%) | 71.802ms (±0.00%) | +0.92%    | 35.151mb        | 35.151mb   | 0.00%       |
| benchLoad10000Events ()                | 1.094ms (±0.00%)  | 1.068ms (±0.00%)  | +2.38%    | 35.151mb        | 35.151mb   | 0.00%       |
+----------------------------------------+-------------------+-------------------+-----------+-----------------+------------+-------------+

CommandToQueryBench
===================

+----------------+------------------+------------------+-----------+-----------------+------------+-------------+
|                | time (kde mode)                                 | memory                                     |
+----------------+------------------+------------------+-----------+-----------------+------------+-------------+
| subject        | Tag: <current>   | Tag: base        | time-diff | Tag: <current>  | Tag: base  | memory-diff |
+----------------+------------------+------------------+-----------+-----------------+------------+-------------+
| benchCreate () | 3.820ms (±0.00%) | 4.025ms (±0.00%) | -5.10%    | 5.057mb         | 5.056mb    | +0.01%      |
| benchUpdate () | 5.059ms (±0.00%) | 5.311ms (±0.00%) | -4.75%    | 5.067mb         | 5.067mb    | 0.00%       |
| benchBoth ()   | 8.616ms (±0.00%) | 8.649ms (±0.00%) | -0.38%    | 5.232mb         | 5.389mb    | -2.93%      |
+----------------+------------------+------------------+-----------+-----------------+------------+-------------+

This comment gets update everytime a new commit comes in!

@DavidBadura
DavidBadura merged commit 377760a into 4.0.x Oct 3, 2026
37 of 39 checks passed
@DavidBadura
DavidBadura deleted the event-tag-methods branch October 3, 2026 20:24
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