protected function mountEventReceivers(Jarvis $app) { $app->on(BroadcasterInterface::EXCEPTION_EVENT, function (ExceptionEvent $event) use($app) : void { $throwable = $event->exception(); $msg = sprintf('[%s] error in %s at line %s with message: %s', get_class($throwable), $throwable->getFile(), $throwable->getLine(), $throwable->getMessage()); if (!$app['debug']) { error_log($msg); $msg = ''; } $event->setResponse(new Response($msg, Response::HTTP_INTERNAL_SERVER_ERROR)); }, BroadcasterInterface::RECEIVER_LOW_PRIORITY); $app->on(BroadcasterInterface::CONTROLLER_EVENT, function (ControllerEvent $event) use($app) : void { $finalArgs = []; $rawArgs = $event->arguments(); $refMethod = new \ReflectionMethod($event->callback(), '__invoke'); foreach ($refMethod->getParameters() as $refParam) { if (null !== ($refClass = $refParam->getClass())) { if (isset($app[$refClass->getName()])) { $finalArgs[$refParam->getPosition()] = $app[$refClass->getName()]; continue; } } if (in_array($refParam->name, array_keys($rawArgs))) { $finalArgs[$refParam->getPosition()] = $rawArgs[$refParam->name]; } } $event->setArguments($finalArgs); }, BroadcasterInterface::RECEIVER_LOW_PRIORITY); }
public function testBroadcastTerminateEventOnDestruct() { $app = new Jarvis(); $receiver = new FakeReceiver(); $app->on(BroadcasterInterface::TERMINATE_EVENT, [$receiver, 'onEventBroadcast']); $this->assertNull($receiver->event); unset($app); gc_collect_cycles(); $this->assertNotNull($receiver->event); $this->assertInstanceOf(SimpleEvent::class, $receiver->event); }
public function testPermanentEvent() { $app = new Jarvis(); $receiver = new FakeReceiver(); $name = 'classic.event'; $simpleEvent = new SimpleEvent(); $this->assertNull($receiver->event); $app->broadcast($name, $simpleEvent); $app->on($name, [$receiver, 'onEventBroadcast']); $this->assertNull($receiver->event); $name = 'permanent.event'; $permanentEvent = new PermanentEvent(); $app->broadcast($name, $permanentEvent); $app->on($name, [$receiver, 'onEventBroadcast']); $this->assertSame($permanentEvent, $receiver->event); }