示例#1
0
 /**
  * @return Nette\Application\IResponse
  */
 public function run(Application\Request $request)
 {
     $this->request = $request;
     $httpRequest = $this->context->getByType('Nette\\Http\\IRequest');
     if (!$httpRequest->isAjax() && ($request->isMethod('get') || $request->isMethod('head'))) {
         $refUrl = clone $httpRequest->getUrl();
         $url = $this->context->getService('router')->constructUrl($request, $refUrl->setPath($refUrl->getScriptPath()));
         if ($url !== NULL && !$httpRequest->getUrl()->isEqual($url)) {
             return new Responses\RedirectResponse($url, Http\IResponse::S301_MOVED_PERMANENTLY);
         }
     }
     $params = $request->getParameters();
     if (!isset($params['callback'])) {
         throw new Application\BadRequestException("Parameter callback is missing.");
     }
     $params['presenter'] = $this;
     $callback = new Nette\Callback($params['callback']);
     $response = $callback->invokeArgs(Application\UI\PresenterComponentReflection::combineArgs($callback->toReflection(), $params));
     if (is_string($response)) {
         $response = array($response, array());
     }
     if (is_array($response)) {
         if ($response[0] instanceof \SplFileInfo) {
             $response = $this->createTemplate('Nette\\Templating\\FileTemplate')->setParameters($response[1])->setFile($response[0]);
         } else {
             $response = $this->createTemplate('Nette\\Templating\\Template')->setParameters($response[1])->setSource($response[0]);
         }
     }
     if ($response instanceof Nette\Templating\ITemplate) {
         return new Responses\TextResponse($response);
     } else {
         return $response;
     }
 }
 /**
  * Calls method using autowiring.
  * @param  mixed   class, object, function, callable
  * @param  array   arguments
  * @return mixed
  */
 public function callMethod($function, array $args = array())
 {
     $callback = new Nette\Callback($function);
     return $callback->invokeArgs(Helpers::autowireArguments($callback->toReflection(), $args, $this));
 }
示例#3
0
 private function resolveClass($name, $recursive = array())
 {
     if (isset($recursive[$name])) {
         throw new Nette\InvalidArgumentException('Circular reference detected for services: ' . implode(', ', array_keys($recursive)) . '.');
     }
     $recursive[$name] = TRUE;
     $def = $this->definitions[$name];
     $factory = $this->normalizeEntity($this->expand($def->factory->entity));
     if ($def->class) {
         return $def->class;
     } elseif (is_array($factory)) {
         // method calling
         if ($service = $this->getServiceName($factory[0])) {
             if (Strings::contains($service, '\\')) {
                 // @\Class
                 throw new ServiceCreationException("Unable resolve class name for service '{$name}'.");
             }
             $factory[0] = $this->resolveClass($service, $recursive);
             if (!$factory[0]) {
                 return;
             }
         }
         $factory = new Nette\Callback($factory);
         if (!$factory->isCallable()) {
             throw new Nette\InvalidStateException("Factory '{$factory}' is not callable.");
         }
         try {
             $reflection = $factory->toReflection();
             $def->class = preg_replace('#[|\\s].*#', '', $reflection->getAnnotation('return'));
             if ($def->class && !class_exists($def->class) && $def->class[0] !== '\\' && $reflection instanceof \ReflectionMethod) {
                 $def->class = $reflection->getDeclaringClass()->getNamespaceName() . '\\' . $def->class;
             }
         } catch (\ReflectionException $e) {
         }
     } elseif ($service = $this->getServiceName($factory)) {
         // alias or factory
         if (Strings::contains($service, '\\')) {
             // @\Class
             $def->autowired = FALSE;
             return $def->class = $service;
         }
         if ($this->definitions[$service]->shared) {
             $def->autowired = FALSE;
         }
         return $def->class = $this->resolveClass($service, $recursive);
     } else {
         return $def->class = $factory;
         // class name
     }
 }
 /**
  * Register an event listener.
  *
  * Autodetects the callback type according to its first argument. If there is none or its class
  * is \ApiGen\Event, the callback will receive the event instance. If not, the event payload will
  * be expanded and passed as arguments. The original event will be the last argument in that case.
  *
  * @param string $originName Origin name
  * @param string $eventName Event name
  * @param \Nette\Callback $callback Registered callback
  * @param integer $priority Listener priority
  * @return \ApiGen\IEventDispatcher
  * @throws \Nette\InvalidStateException If the given origin does not exist
  */
 public function registerListener($originName, $eventName, Callback $callback, $priority = 1)
 {
     $this->updating();
     if (!isset($this->origins[$originName])) {
         throw new InvalidStateException(sprintf('Origin "%s" is not registered.', $originName));
     }
     $internalName = $this->getInternalEventName($originName, $eventName);
     $needsSorting = !isset($this->listeners[$internalName][$priority]);
     $params = $callback->toReflection()->getParameters();
     if (count($params) > 0 && $params[0]->getClassName() !== 'ApiGen\\Event') {
         $this->listeners[$internalName][$priority][] = function (Event $event) use($callback) {
             return EventDispatcher::expandEventCallback($callback, $event);
         };
     } else {
         $this->listeners[$internalName][$priority][] = $callback;
     }
     if ($needsSorting) {
         krsort($this->listeners[$internalName], SORT_NUMERIC);
     }
     return $this;
 }