1: <?php
2: /**
3: * Wei Framework
4: *
5: * @copyright Copyright (c) 2008-2015 Twin Huang
6: * @license http://opensource.org/licenses/mit-license.php MIT License
7: */
8:
9: namespace Wei;
10:
11: /**
12: * A helper service to generate the URL
13: *
14: * @author Twin Huang <twinhuang@qq.com>
15: * @property Request $request A service that handles the HTTP request data
16: */
17: class Url extends Base
18: {
19: /**
20: * Generate the URL by specified URL and parameters
21: *
22: * @param string $url
23: * @param string|array $argsOrParams
24: * @param string|array $params
25: * @return string
26: */
27: public function __invoke($url = '', $argsOrParams = array(), $params = array())
28: {
29: return $this->request->getBaseUrl() . '/' . $this->append($url, $argsOrParams, $params);
30: }
31:
32: /**
33: * Generate the absolute URL path by specified URL and parameters
34: *
35: * @param string $url
36: * @param string|array $argsOrParams
37: * @param string|array $params
38: * @return string
39: */
40: public function full($url, $argsOrParams = array(), $params = array())
41: {
42: return $this->request->getUrlFor($this->__invoke($url, $argsOrParams, $params));
43: }
44:
45: /**
46: * Generate the URL path with current query parameters and specified parameters
47: *
48: * @param string $url
49: * @param string|array $argsOrParams
50: * @param string|array $params
51: * @return string
52: */
53: public function query($url = '', $argsOrParams = array(), $params = array())
54: {
55: return $this->__invoke($url, $argsOrParams, $params + $this->request->getQueries());
56: }
57:
58: /**
59: * Append parameters to specified URL
60: *
61: * @param string $url
62: * @param string|array $argsOrParams The arguments to replace in URL or the parameters append to the URL
63: * @param string|array $params The parameters append to the URL
64: * @return string
65: */
66: public function append($url = '', $argsOrParams = array(), $params = array())
67: {
68: if (strpos($url, '%s') !== false) {
69: $url = vsprintf($url, (array)$argsOrParams);
70: } else {
71: $params = $argsOrParams;
72: }
73: if ($params) {
74: $url .= (false === strpos($url, '?') ? '?' : '&');
75: }
76: return $url . (is_array($params) ? http_build_query($params) : $params);
77: }
78: }
79: