public function testClosureExecuteQuery() { $gate = new Gate(); $gate->enableSystemBus(); $gate->attach($this->bus); $this->bus->mapQuery('Malocher\\CqrsTest\\Coverage\\Mock\\Query\\MockQuery', function (MockQuery $query) { $query->edit(); }); $gate->getSystemBus()->mapCommand('Malocher\\Cqrs\\Command\\ExecuteQueryCommand', function (ExecuteQueryCommand $command) { $this->executeQueryCommand = $command; }); $gate->getSystemBus()->registerEventListener('Malocher\\Cqrs\\Event\\QueryExecutedEvent', function (QueryExecutedEvent $event) { $this->queryExecutedEvent = $event; }); $mockQuery = new MockQuery(); $gate->getBus($this->bus->getName())->executeQuery($mockQuery); $this->assertEquals(true, $mockQuery->isEdited()); $this->assertInstanceOf('Malocher\\Cqrs\\Command\\ExecuteQueryCommand', $this->executeQueryCommand); $this->assertInstanceOf('Malocher\\Cqrs\\Event\\QueryExecutedEvent', $this->queryExecutedEvent); $this->assertEquals('Malocher\\CqrsTest\\Coverage\\Mock\\Query\\MockQuery', $this->executeQueryCommand->getMessageClass()); $this->assertEquals('Malocher\\CqrsTest\\Coverage\\Mock\\Query\\MockQuery', $this->queryExecutedEvent->getMessageClass()); }
/** * @event Malocher\Cqrs\Event\QueryExecutedEvent * @param QueryExecutedEvent $event */ public function queryExecutedHandler(QueryExecutedEvent $event) { print "---- monitoring start -----\n"; print sprintf("QueryExecutedEvent published by %s on %s \n", $event->getMessageClass(), $event->getBusName()); print sprintf("id:%s, edited:%s, ts:%s, version:%s, payload:%s \n", $event->getMessageVars()['id'], $event->getMessageVars()['edited'], $event->getMessageVars()['timestamp'], $event->getMessageVars()['version'], $event->getMessageVars()['payload']); print "---- monitoring ends ------\n"; }
/** * {@inheritDoc} */ public function executeQuery(QueryInterface $query) { // ExecuteQueryCommand first! Because a queryClass _IS_ actually invoked. if (!is_null($this->gate->getSystemBus())) { $executeQueryCommand = new ExecuteQueryCommand(); $executeQueryCommand->setMessageClass(get_class($query)); $executeQueryCommand->setMessageVars($query->getMessageVars()); $executeQueryCommand->setBusName($this->getName()); $this->gate->getSystemBus()->invokeCommand($executeQueryCommand); } try { $response = $this->bus->executeQuery($query); if ($response === false) { return false; } } catch (BusException $ex) { //throw it again throw $ex; } catch (\Exception $ex) { throw BusException::defaultBusError($ex->getMessage(), null, $ex); } // Dispatch the QueryExecutedEvent here! If for example a query could not be executed // because it does not exist in the queryHandlerMap[<empty>] this Event would never // be dispatched! if (!is_null($this->gate->getSystemBus())) { $queryExecutedEvent = new QueryExecutedEvent(); $queryExecutedEvent->setMessageClass(get_class($query)); $queryExecutedEvent->setMessageVars($query->getMessageVars()); $queryExecutedEvent->setBusName($this->getName()); $queryExecutedEvent->setResult($response); $this->gate->getSystemBus()->publishEvent($queryExecutedEvent); } return $response; }