_url_helpers) $this->_url_helpers = new UrlHelpers\UrlHelpers(); return $this->_url_helpers; } public function rootRoute() { return $this->routes()->rootRoute(); } public function panelRoute() { return $this->routes()->panelRoute(); } public function assetsRoute() { return $this->routes()->assetsRoute(); } public function find_route() { $this->matchRoutes(); } public function route() { return $this->_route; } public function routes() { $this->importRoutes(); return $this->_routes; } /** * Base path can be get in views by calling urlFor('base') or basePath(). */ public function basePath() { if ($this->base_path === false) { if ($base_path = Rails::application()->config()->base_path) $this->base_path = '/' . $base_path; elseif (($base_path = $this->detectBasePath()) && $base_path != '/') $this->base_path = $base_path; else $this->base_path = null; } return $this->base_path; } public function rootPath() { ############ WARNING ############ MUST UPDATE ALL SYSTEMS TO THIS CHANGE (added trailing slash when returning basePath) if ($base_path = $this->basePath()) return $base_path . '/'; return '/'; } public function urlFor($params, $ignore_missmatch = false) { $urlfor = new UrlFor($params, $ignore_missmatch); return $urlfor->url(); } private function importRoutes() { if ($this->_imported_routes) return; $this->_imported_routes = true; $this->_routes = new Route\RouteSet(); $config = Rails::config(); $routes_file = $config->paths->config->concat('routes.php'); require $routes_file; } private function matchRoutes() { $this->importRoutes(); $request_path = $this->_find_request_path(); $request_method = Rails::application()->dispatcher()->request()->method(); if ($this->rootRoute()->match($request_path, $request_method)) { $this->_route = $this->rootRoute(); } elseif ($this->panelRoute() && $this->panelRoute()->match($request_path, $request_method)) { $this->_route = $this->panelRoute(); } elseif ($this->assetsRoute() && $this->assetsRoute()->match($request_path, $request_method)) { $this->_route = $this->assetsRoute(); } else { foreach ($this->routes() as $route) { if ($route->match($request_path, $request_method)) { if (!is_file($route->controller_file())) { throw new Exception\RoutingErrorException( sprintf('Controller file for "%sController" not found %s', Rails::services()->get('inflector')->camelize($route->controller), $route->modules ? ' [ module=>' . $route->namespace_path() . ' ]' : '' ) ); } else { $this->_route = $route; break; } } } } if (!$this->_route) { throw new Exception\NotFoundException( sprintf('No route matches [%s] "%s"', Rails::application()->dispatcher()->request()->method(), Rails::application()->dispatcher()->request()->path() ) ); } } private function _find_request_path() { if (!$this->_request_path) { preg_match('/([^?]+)/', $_SERVER['REQUEST_URI'], $m); $this->_request_path = $m[1]; } return $this->_request_path; } /** * This method was copied from ZF2, slightly modified to fit Rails. * Zend\Http\PhpEnvironment\Request::detectBaseUrl() */ protected function detectBasePath() { $request = Rails::application()->dispatcher()->request(); $baseUrl = ''; $filename = $request->get('SCRIPT_FILENAME'); $scriptName = $request->get('SCRIPT_NAME'); $phpSelf = $request->get('PHP_SELF'); $origScriptName = $request->get('ORIG_SCRIPT_NAME'); if ($scriptName !== null && basename($scriptName) === $filename) { $baseUrl = $scriptName; } elseif ($phpSelf !== null && basename($phpSelf) === $filename) { $baseUrl = $phpSelf; } elseif ($origScriptName !== null && basename($origScriptName) === $filename) { $baseUrl = $origScriptName; } else { $baseUrl = '/'; $basename = basename($filename); if ($basename) { $path = ($phpSelf ? trim($phpSelf, '/') : ''); $baseUrl .= substr($path, 0, strpos($path, $basename)) . $basename; } } $requestUri = $request->get('REQUEST_URI'); if (0 === strpos($requestUri, $baseUrl)) { return $baseUrl; } $baseDir = str_replace('\\', '/', dirname($baseUrl)); if (0 === strpos($requestUri, $baseDir)) { return $baseDir; } $truncatedRequestUri = $requestUri; if (false !== ($pos = strpos($requestUri, '?'))) { $truncatedRequestUri = substr($requestUri, 0, $pos); } $basename = basename($baseUrl); if (empty($basename) || false === strpos($truncatedRequestUri, $basename)) { return ''; } if (strlen($requestUri) >= strlen($baseUrl) && (false !== ($pos = strpos($requestUri, $baseUrl)) && $pos !== 0) ) { $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl)); } return $baseUrl; } }