/** * Create a new Url class representing the given url * * If $params are given, those will be added to the urls parameters * and overwrite any existing parameters * * @param string $url The string representation of the url to parse * @param array $params An array of parameters that should additionally be considered for the url * @param Zend_Request $request A request to use instead of the default one * * @return Url */ public static function fromPath($url, array $params = array(), $request = null) { if ($request === null) { $request = self::getRequest(); } if (!is_string($url)) { throw new ProgrammingError('url "%s" is not a string', $url); } $urlObject = new Url(); if ($url === '#') { $urlObject->setPath($url); return $urlObject; } $urlParts = parse_url($url); if (isset($urlParts['scheme']) && ($urlParts['scheme'] !== $request->getScheme() || isset($urlParts['host']) && $urlParts['host'] !== $request->getServer('SERVER_NAME') || isset($urlParts['port']) && $urlParts['port'] != $request->getServer('SERVER_PORT'))) { $urlObject->setIsExternal(); } if (isset($urlParts['path'])) { $urlPath = $urlParts['path']; if ($urlPath && $urlPath[0] === '/') { if ($urlObject->isExternal() || isset($urlParts['user'])) { $urlPath = substr($urlPath, 1); } else { $requestBaseUrl = $request->getBaseUrl(); if ($requestBaseUrl && $requestBaseUrl !== '/' && strpos($urlPath, $requestBaseUrl) === 0) { $urlPath = substr($urlPath, strlen($requestBaseUrl) + 1); $urlObject->setBasePath($requestBaseUrl); } } } elseif (!$urlObject->isExternal()) { $urlObject->setBasePath($request->getBaseUrl()); } $urlObject->setPath($urlPath); } elseif (!$urlObject->isExternal()) { $urlObject->setBasePath($request->getBaseUrl()); } // TODO: This has been used by former filter implementation, remove it: if (isset($urlParts['query'])) { $params = UrlParams::fromQueryString($urlParts['query'])->mergeValues($params); } if (isset($urlParts['fragment'])) { $urlObject->setAnchor($urlParts['fragment']); } if (isset($urlParts['user']) || $urlObject->isExternal()) { if (isset($urlParts['user'])) { $urlObject->setUsername($urlParts['user']); } if (isset($urlParts['host'])) { $urlObject->setHost($urlParts['host']); } if (isset($urlParts['port'])) { $urlObject->setPort($urlParts['port']); } if (isset($urlParts['scheme'])) { $urlObject->setScheme($urlParts['scheme']); } if (isset($urlParts['pass'])) { $urlObject->setPassword($urlParts['pass']); } } $urlObject->setParams($params); return $urlObject; }