Feature: #101544 - Introduce PHP attribute to autoconfigure event listeners
See forge#101544
Description
A new custom PHP attribute \TYPO3\
has been added in order to autoconfigure a class as a PSR-14 event listener.
The attribute supports the following properties, which are all optional,
as if you would register the listener by manually tagging it in the
Configuration/
or Configuration/
file:
identifier
- Event listener identifier (unique) - uses the service name, if not providedevent
- Fully-qualified class name of the PSR-14 event to listen tomethod
- Method to be called - if omitted,__
is called by the listener provider.invoke () before
- List of listener identifiersafter
- List of listener identifiers
The attribute can be used on class and method level. Additionally, the new attribute is repeatable, which allows to register the same class to listen for different events.
Migration example
Before:
MyVendor\MyExtension\EventListener\AddMailMessageBcc:
tags:
- name: event.listener
identifier: 'my-extension/add-mail-message-bcc'
<?php
namespace MyVendor\MyExtension\EventListener;
use TYPO3\CMS\Core\Mail\Event\BeforeMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\MailMessage;
final readonly class AddMailMessageBcc
{
public function __invoke(BeforeMailerSentMessageEvent $event): void
{
$message = $event->getMessage();
if ($message instanceof MailMessage) {
$message->addBcc('me@example.com');
}
$event->setMessage($message);
}
}
After:
The configuration is removed from the Services.
file and the
attribute is assigned to the class instead:
<?php
namespace MyVendor\MyExtension\EventListener;
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Core\Mail\Event\BeforeMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\MailMessage;
#[AsEventListener(
identifier: 'my-extension/add-mail-message-bcc'
)]
final readonly class AddMailMessageBcc
{
public function __invoke(BeforeMailerSentMessageEvent $event): void
{
$message = $event->getMessage();
if ($message instanceof MailMessage) {
$message->addBcc('me@example.com');
}
$event->setMessage($message);
}
}
Repeatable example
<?php
namespace MyVendor\MyExtension\EventListener;
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Core\Mail\Event\AfterMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\Event\BeforeMailerSentMessageEvent;
#[AsEventListener(
identifier: 'my-extension/mailer-after-sent-message',
event: AfterMailerSentMessageEvent::class
)]
#[AsEventListener(
identifier: 'my-extension/mailer-before-sent-message',
event: BeforeMailerSentMessageEvent::class
)]
final readonly class MailerEventListener
{
public function __invoke(
AfterMailerSentMessageEvent | BeforeMailerSentMessageEvent $event
): void {
// do something
}
}
Method level example
<?php
namespace MyVendor\MyExtension\EventListener;
use TYPO3\CMS\Core\Attribute\AsEventListener;
use TYPO3\CMS\Core\Mail\Event\AfterMailerSentMessageEvent;
use TYPO3\CMS\Core\Mail\Event\BeforeMailerSentMessageEvent;
final readonly class MailerEventListener
{
#[AsEventListener(
identifier: 'my-extension/mailer-after-sent-message',
event: AfterMailerSentMessageEvent::class
)]
#[AsEventListener(
identifier: 'my-extension/mailer-before-sent-message',
event: BeforeMailerSentMessageEvent::class
)]
public function __invoke(
AfterMailerSentMessageEvent | BeforeMailerSentMessageEvent $event
): void {
// do something
}
}
Impact
Using the PHP attribute \TYPO3\
, it is
now possible to tag any PHP class as an event listener. By adding the attribute
the class is automatically tagged as event.
and is therefore
autoconfigured by the
\TYPO3\
.