/** * @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; }