Example #1
0
 /**
  * @param Route $route
  * @param array $args
  *
  * @return string|array|\SimpleXMLElement
  */
 private function callController(Route $route, array $args)
 {
     $callback = $route->getController();
     $this->currentRoute = $route;
     // route args
     $args = array_merge($route->getArgs(), $args);
     $this->args = $args;
     // simple function
     if (is_callable($callback) && is_object($callback)) {
         return call_user_func_array($callback, [$args]);
     }
     // controller
     preg_match('`([A-Za-z_0-9\\\\<>]+)(?:::)?([A-Za-z_0-9_<>]+)?`', $callback, $find);
     $class = $this->replaceDynamicArgs($find[1], $route, $args);
     $method = isset($find[2]) ? $this->replaceDynamicArgs($find[2], $route, $args) : null;
     // replace class dynamic args
     if (!class_exists($class)) {
         throw new \BadMethodCallException(sprintf("Can't load class '%s' on route '%s'", $class, $route->getName()));
     }
     $controller = new $class();
     if (is_null($method)) {
         $method = 'get';
         if (self::request()->isAjax() && method_exists($controller, 'ajax')) {
             $method = 'ajax';
         } elseif (self::request()->getMethod() == 'POST' && method_exists($controller, 'post')) {
             $method = 'post';
         }
     }
     $ordererArgs = $this->mapArguments($controller, $method, $args);
     $event = new TimerEvent('router.mainController');
     $event->setData(['controller' => $class, 'method' => $method, 'data' => $ordererArgs]);
     $return = null;
     if (method_exists($controller, 'init')) {
         $return = call_user_func_array([$controller, 'init'], $ordererArgs);
     }
     if (is_null($return)) {
         $return = call_user_func_array([$controller, $method], $ordererArgs);
     }
     self::emit($event);
     return $return;
 }