3 * Zend Framework (http://framework.zend.com/)
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license http://framework.zend.com/license/new-bsd New BSD License
10 namespace Zend\Mvc\Router\Http
;
13 use Zend\Mvc\Router\Exception
;
14 use Zend\Stdlib\ArrayUtils
;
15 use Zend\Stdlib\RequestInterface
as Request
;
20 class Wildcard
implements RouteInterface
23 * Delimiter between keys and values.
27 protected $keyValueDelimiter;
30 * Delimiter before parameters.
34 protected $paramDelimiter;
44 * List of assembled parameters.
48 protected $assembledParams = [];
51 * Create a new wildcard route.
53 * @param string $keyValueDelimiter
54 * @param string $paramDelimiter
55 * @param array $defaults
57 public function __construct($keyValueDelimiter = '/', $paramDelimiter = '/', array $defaults = [])
59 $this->keyValueDelimiter
= $keyValueDelimiter;
60 $this->paramDelimiter
= $paramDelimiter;
61 $this->defaults
= $defaults;
65 * factory(): defined by RouteInterface interface.
67 * @see \Zend\Mvc\Router\RouteInterface::factory()
68 * @param array|Traversable $options
70 * @throws Exception\InvalidArgumentException
72 public static function factory($options = [])
74 if ($options instanceof Traversable
) {
75 $options = ArrayUtils
::iteratorToArray($options);
76 } elseif (!is_array($options)) {
77 throw new Exception\
InvalidArgumentException(sprintf(
78 '%s expects an array or Traversable set of options',
83 if (!isset($options['key_value_delimiter'])) {
84 $options['key_value_delimiter'] = '/';
87 if (!isset($options['param_delimiter'])) {
88 $options['param_delimiter'] = '/';
91 if (!isset($options['defaults'])) {
92 $options['defaults'] = [];
95 return new static($options['key_value_delimiter'], $options['param_delimiter'], $options['defaults']);
99 * match(): defined by RouteInterface interface.
101 * @see \Zend\Mvc\Router\RouteInterface::match()
102 * @param Request $request
103 * @param integer|null $pathOffset
104 * @return RouteMatch|null
106 public function match(Request
$request, $pathOffset = null)
108 if (!method_exists($request, 'getUri')) {
112 $uri = $request->getUri();
113 $path = $uri->getPath() ?
: '';
119 if ($pathOffset !== null) {
120 $path = substr($path, $pathOffset) ?
: '';
124 $params = explode($this->paramDelimiter
, $path);
126 if (count($params) > 1 && ($params[0] !== '' ||
end($params) === '')) {
130 if ($this->keyValueDelimiter
=== $this->paramDelimiter
) {
131 $count = count($params);
133 for ($i = 1; $i < $count; $i +
= 2) {
134 if (isset($params[$i +
1])) {
135 $matches[rawurldecode($params[$i])] = rawurldecode($params[$i +
1]);
139 array_shift($params);
141 foreach ($params as $param) {
142 $param = explode($this->keyValueDelimiter
, $param, 2);
144 if (isset($param[1])) {
145 $matches[rawurldecode($param[0])] = rawurldecode($param[1]);
150 return new RouteMatch(array_merge($this->defaults
, $matches), strlen($path));
154 * assemble(): Defined by RouteInterface interface.
156 * @see \Zend\Mvc\Router\RouteInterface::assemble()
157 * @param array $params
158 * @param array $options
161 public function assemble(array $params = [], array $options = [])
164 $mergedParams = array_merge($this->defaults
, $params);
165 $this->assembledParams
= [];
168 foreach ($mergedParams as $key => $value) {
169 $elements[] = rawurlencode($key) . $this->keyValueDelimiter
. rawurlencode($value);
171 $this->assembledParams
[] = $key;
174 return $this->paramDelimiter
. implode($this->paramDelimiter
, $elements);
181 * getAssembledParams(): defined by RouteInterface interface.
183 * @see RouteInterface::getAssembledParams
186 public function getAssembledParams()
188 return $this->assembledParams
;