Beispiel #1
0
 /**
  * @param Oxygen_Http_Request $request
  *
  * @return null|Oxygen_Http_Response|Oxygen_Util_HookedClosure
  */
 public function handle(Oxygen_Http_Request $request)
 {
     $dispatcher = $this->container->getDispatcher();
     if (!$request->accepts('application/oxygen')) {
         // Public request.
         $publicRequestEvent = new Oxygen_Event_PublicRequestEvent($request);
         $dispatcher->dispatch(Oxygen_Event_Events::PUBLIC_REQUEST, $publicRequestEvent);
         if ($publicRequestEvent->hasDeferredResponse()) {
             return $publicRequestEvent->getDeferredResponse();
         }
         return $publicRequestEvent->getResponse();
     }
     try {
         // Master request.
         $requestData = json_decode($request->getContent(), true);
         if (!is_array($requestData)) {
             throw new RuntimeException('The request does not contain valid JSON.');
         }
         /** @var Oxygen_Util_RequestData $requestData */
         $requestData = (object) $requestData;
         $masterRequestEvent = new Oxygen_Event_MasterRequestEvent($request, $requestData);
         $dispatcher->dispatch(Oxygen_Event_Events::MASTER_REQUEST, $masterRequestEvent);
         $result = $this->container->getActionKernel()->handle($request, $requestData);
         if ($result instanceof Oxygen_Http_Response) {
             return $this->notifyResponse($request, $requestData, $result);
         } else {
             $callback = new Oxygen_Util_Closure(array($this, 'wrapResponse'), $request, $requestData, $result->getCallable());
             return new Oxygen_Util_HookedClosure($result->getHookName(), $callback->getCallable());
         }
     } catch (Exception $e) {
         return $this->handleException($request, isset($requestData) ? $requestData : null, $e);
     }
 }