Event-Driven Architecture (EDA) memfokuskan pada sistem penyahgandingan dan menjadikannya lebih fleksibel, berskala dan boleh diselenggara dengan bertindak balas kepada acara. Dalam PHP, dua corak penting yang sering digunakan dalam EDA ialah Sumber Peristiwa dan Pengasingan Tanggungjawab Pertanyaan Perintah (CQRS). Berikut ialah panduan langkah demi langkah untuk melaksanakannya menggunakan PHP, bersama-sama dengan contoh praktikal.
Perintah:
Acara:
Baca Model:
Buat struktur direktori:
event-driven-php/ ├── src/ │ ├── Commands/ │ ├── Events/ │ ├── Handlers/ │ ├── Models/ │ └── ReadModels/ ├── tests/ └── vendor/
Pasang kebergantungan (cth., symfony/event-dispatcher):
composer require symfony/event-dispatcher
Arahan mewakili tindakan yang mengubah keadaan. Contoh: PlaceOrderCommand.php.
// src/Commands/PlaceOrderCommand.php class PlaceOrderCommand { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
Peristiwa menerangkan perkara yang berlaku dalam sistem. Contoh: OrderPlacedEvent.php.
// src/Events/OrderPlacedEvent.php class OrderPlacedEvent { public string $orderId; public string $customerId; public function __construct(string $orderId, string $customerId) { $this->orderId = $orderId; $this->customerId = $customerId; } }
Pengendali arahan melaksanakan logik perniagaan sebenar dan membangkitkan acara. Contoh: PlaceOrderHandler.php.
// src/Handlers/PlaceOrderHandler.php use Symfony\Component\EventDispatcher\EventDispatcher; class PlaceOrderHandler { private EventDispatcher $eventDispatcher; public function __construct(EventDispatcher $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } public function handle(PlaceOrderCommand $command) { // Business logic (e.g., check stock, validate order) // Emit the event $event = new OrderPlacedEvent($command->orderId, $command->customerId); $this->eventDispatcher->dispatch($event, 'order.placed'); } }
Pengendali acara mendengar acara tertentu dan mengemas kini model baca. Contoh: OrderProjection.php.
// src/ReadModels/OrderProjection.php class OrderProjection { private array $orders = []; public function onOrderPlaced(OrderPlacedEvent $event) { // Save or update read model with necessary data $this->orders[$event->orderId] = [ 'orderId' => $event->orderId, 'customerId' => $event->customerId, 'status' => 'placed' ]; } public function getOrder(string $orderId) { return $this->orders[$orderId] ?? null; } }
use Symfony\Component\EventDispatcher\EventDispatcher; // Bootstrapping the system $dispatcher = new EventDispatcher(); $orderProjection = new OrderProjection(); // Register event listeners $dispatcher->addListener('order.placed', [$orderProjection, 'onOrderPlaced']); // Create the command and command handler $command = new PlaceOrderCommand('123', 'cust_001'); $handler = new PlaceOrderHandler($dispatcher); // Handle the command (Place the order) $handler->handle($command); // Query the read model for the order $order = $orderProjection->getOrder('123'); print_r($order);
Output:
Array ( [orderId] => 123 [customerId] => cust_001 [status] => placed )
Untuk mendapatkan sumber acara penuh, anda juga akan melaksanakan kedai acara untuk meneruskan acara ke pangkalan data.
class EventStore { private array $storedEvents = []; public function append(Event $event) { $this->storedEvents[] = $event; } public function getEventsForAggregate(string $aggregateId): array { return array_filter($this->storedEvents, function($event) use ($aggregateId) { return $event->aggregateId === $aggregateId; }); } }
Contoh ini menunjukkan aplikasi mudah CQRS dan Sumber Acara dalam PHP. Dengan corak ini, anda boleh membina sistem yang berskala dengan baik dan boleh diselenggara, sambil menyediakan kebolehauditan yang berkuasa dan pengendalian baca/tulis yang fleksibel. Seni bina boleh berkembang dengan unjuran tambahan, pengendalian acara yang lebih kompleks dan integrasi luaran seperti baris gilir pemesejan atau pemberitahuan pihak ketiga.
Atas ialah kandungan terperinci Melaksanakan Seni Bina Didorong Peristiwa dalam PHP: Penyelaman Mendalam ke dalam Penyumberan Acara dan CQRS. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!