PHP code example of fast-forward / event-dispatcher
1. Go to this page and download the library: Download fast-forward/event-dispatcher library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
fast-forward / event-dispatcher example snippets
declare(strict_types=1);
use FastForward\Config\ArrayConfig;
use FastForward\EventDispatcher\ServiceProvider\EventDispatcherServiceProvider;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\ListenerProviderInterface;
use function FastForward\Container\container;
final readonly class UserRegistered
{
public function __construct(public string $email) {}
}
final class SendWelcomeEmailListener
{
public function __invoke(UserRegistered $event): void
{
echo 'Sending welcome email to ' . $event->email . PHP_EOL;
}
}
$config = new ArrayConfig([
ListenerProviderInterface::class => [
SendWelcomeEmailListener::class,
],
]);
$container = container($config, EventDispatcherServiceProvider::class);
$dispatcher = $container->get(EventDispatcherInterface::class);
$dispatcher->dispatch(new UserRegistered('[email protected]'));
declare(strict_types=1);
use FastForward\Config\ArrayConfig;
use FastForward\Container\ContainerInterface;
use FastForward\EventDispatcher\ServiceProvider\EventDispatcherServiceProvider;
use Psr\EventDispatcher\ListenerProviderInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use function FastForward\Container\container;
final readonly class PaymentReceived
{
public function __construct(
public string $invoiceId,
public float $amount,
) {}
}
final class BillingSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
'billing.payment_received' => 'onPaymentReceived',
];
}
public function onPaymentReceived(PaymentReceived $event): void
{
echo 'Payment confirmed for invoice ' . $event->invoiceId . PHP_EOL;
}
}
$config = new ArrayConfig([
ContainerInterface::class => [
EventDispatcherServiceProvider::class,
],
ListenerProviderInterface::class => [
BillingSubscriber::class,
],
]);
$container = container($config);
$dispatcher = $container->get(EventDispatcherInterface::class);
$dispatcher->dispatch(
new PaymentReceived('INV-2026-0001', 199.90),
'billing.payment_received',
);
declare(strict_types=1);
use FastForward\Config\ArrayConfig;
use FastForward\Container\ContainerInterface;
use FastForward\EventDispatcher\ServiceProvider\EventDispatcherServiceProvider;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\ListenerProviderInterface;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use function FastForward\Container\container;
final readonly class OrderConfirmed
{
public function __construct(public string $orderNumber) {}
}
final class ReserveStockListener
{
#[AsEventListener(priority: 100)]
public function __invoke(OrderConfirmed $event): void
{
echo 'Reserving stock for ' . $event->orderNumber . PHP_EOL;
}
}
final class NotifyOperationsListener
{
#[AsEventListener(priority: 10)]
public function __invoke(OrderConfirmed $event): void
{
echo 'Notifying operations about ' . $event->orderNumber . PHP_EOL;
}
}
$config = new ArrayConfig([
ContainerInterface::class => [
EventDispatcherServiceProvider::class,
],
ListenerProviderInterface::class => [
NotifyOperationsListener::class,
ReserveStockListener::class,
],
]);
$container = container($config);
$dispatcher = $container->get(EventDispatcherInterface::class);
$dispatcher->dispatch(new OrderConfirmed('PED-2026-0042'));
declare(strict_types=1);
use FastForward\Config\ArrayConfig;
use FastForward\Container\ContainerInterface;
use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use FastForward\EventDispatcher\Listener\LogErrorEventListener;
use FastForward\EventDispatcher\ServiceProvider\EventDispatcherServiceProvider;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\EventDispatcher\ListenerProviderInterface;
use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface;
use function FastForward\Container\container;
final readonly class ImportReportRequested
{
public function __construct(public string $reportId) {}
}
final class FailingImportListener
{
public function __invoke(ImportReportRequested $event): void
{
throw new RuntimeException('Failed to generate the report ' . $event->reportId);
}
}
final class StdoutLogger extends AbstractLogger
{
public function log($level, \Stringable|string $message, array $context = []): void
{
echo '[' . strtoupper((string) $level) . '] ' . $message . PHP_EOL;
}
}
$config = new ArrayConfig([
ContainerInterface::class => [
EventDispatcherServiceProvider::class,
],
ListenerProviderInterface::class => [
FailingImportListener::class,
LogErrorEventListener::class,
],
]);
$container = container(
$config,
new ArrayServiceProvider([
LoggerInterface::class => static fn(): LoggerInterface => new StdoutLogger(),
]),
);
$dispatcher = $container->get(EventDispatcherInterface::class);
try {
$dispatcher->dispatch(new ImportReportRequested('REL-2026-0007'));
} catch (Throwable $exception) {
echo $exception->getMessage() . PHP_EOL;
}
declare(strict_types=1);
use FastForward\Config\ArrayConfig;
use FastForward\Container\ContainerInterface;
use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use FastForward\EventDispatcher\ListenerProvider\LogEventListenerProvider;
use FastForward\EventDispatcher\ServiceProvider\EventDispatcherServiceProvider;
use Psr\EventDispatcher\ListenerProviderInterface;
use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
use function FastForward\Container\container;
final readonly class UserRegistered
{
public function __construct(public string $email) {}
}
final class StdoutLogger extends AbstractLogger
{
public function log($level, \Stringable|string $message, array $context = []): void
{
echo '[' . strtoupper((string) $level) . '] ' . $message . PHP_EOL;
echo 'Event class: ' . $context['event_class'] . PHP_EOL;
if (isset($context['event_name'])) {
echo 'Event name: ' . $context['event_name'] . PHP_EOL;
}
if (isset($context['wrapped_event_class'])) {
echo 'Wrapped event class: ' . $context['wrapped_event_class'] . PHP_EOL;
}
echo PHP_EOL;
}
}
$config = new ArrayConfig([
ContainerInterface::class => [
EventDispatcherServiceProvider::class,
],
ListenerProviderInterface::class => [
LogEventListenerProvider::class,
],
]);
$container = container(
$config,
new ArrayServiceProvider([
LoggerInterface::class => static fn(): LoggerInterface => new StdoutLogger(),
]),
);
$dispatcher = $container->get(EventDispatcherInterface::class);
$dispatcher->dispatch(new UserRegistered('[email protected]'), 'users.registered');
declare(strict_types=1);
use FastForward\EventDispatcher\Event\Event;
final class InventoryReservationRequested extends Event
{
public function __construct(public string $sku) {}
}