Router::translate()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 3
Bugs 0 Features 1
Metric Value
c 3
b 0
f 1
dl 0
loc 14
ccs 0
cts 6
cp 0
rs 9.4285
cc 3
eloc 6
nc 3
nop 2
crap 12
1
<?php
2
/**
3
 * @package    Fuel\Routing
4
 * @version    2.0
5
 * @author     Fuel Development Team
6
 * @license    MIT License
7
 * @copyright  2010 - 2015 Fuel Development Team
8
 * @link       http://fuelphp.com
9
 */
10
11
namespace Fuel\Routing;
12
13
use Closure;
14
use LogicException;
15
16
class Router extends Container
17
{
18
	const MATCH_ANY = '.+';
19
	const MATCH_NUM = '[[:digit:]]+';
20
	const MATCH_ALNUM = '[[:alnum:]]+';
21
	const MATCH_ALPHA = '[[:alpha:]]+';
22
	const MATCH_SEGMENT = '[^/]*';
23
24
	protected $filters = array();
25
26
	protected $autoFilter = null;
27
28
	public function setAutoFilter($filter)
29
	{
30
		$this->autoFilter = $filter;
31
32
		return $this;
33
	}
34
35
	public function filter($filter, Closure $callback)
36
	{
37
		$this->filters[$filter] = $callback;
38
39
		return $this;
40
	}
41
42
	public function applyFilters(Match $match, array $filters)
43
	{
44
		foreach ($filters as $filter => $parameters)
45
		{
46
			array_unshift($parameters, $match);
47
			$filter = $this->resolveFilter($filter);
48
			$result = call_user_func_array($filter, $parameters);
49
50
			if ($result === null or $result === true)
51
			{
52
				continue;
53
			}
54
55
			if ($result === false)
56
			{
57
				return false;
58
			}
59
60
			$match->response = $result;
61
62
			break;
63
		}
64
65
		return $match;
66
	}
67
68
	public function applyAutoFilter(Match $match)
69
	{
70
		return call_user_func($this->autoFilter, $match);
71
	}
72
73
	public function resolveFilter($name)
74
	{
75
		if (isset($this->filters[$name]))
76
		{
77
			return $this->filters[$name];
78
		}
79
80
		$method = 'filter'.ucfirst($name);
81
82
		if (method_exists($this, $method))
83
		{
84
			return array($this, $method);
85
		}
86
87
		throw new LogicException('Could not find filter: '.$name);
88
	}
89
90
	public function filterDomain(Match $match, $domain)
91
	{
92
		return $_SERVER['SERVER_NAME'] === $domain;
93
	}
94
95
	public function filterNamespace(Match $match, $namespace)
96
	{
97
		$match->setNamespace($namespace);
98
	}
99
100
	public function filterController(Match $match, $controller)
101
	{
102
		$match->setController($controller);
103
	}
104
105
	public function filterAction(Match $match, $action)
106
	{
107
		$match->setAction($action);
108
	}
109
110
	public function filterTo(Match $match, $to)
111
	{
112
		list($controller, $action) = explode('@', $to);
113
114
		$match->setController($controller);
115
		$match->setAction($action);
116
	}
117
118
	public function translate($uri, $method)
119
	{
120
		$uri = trim($uri, '/');
121
122
		foreach ($this->routes as $route)
123
		{
124
			if ($match = $this->match($route, $uri, $method))
125
			{
126
				return $match;
127
			}
128
		}
129
130
		return new Match(null, $method, $uri, $uri);
131
	}
132
133
	public function match(Route $route, $uri, $method = '*')
134
	{
135
		if ($match = $route->match($uri, $method))
136
		{
137
			if ($route->filters)
0 ignored issues
show
Bug Best Practice introduced by
The expression $route->filters of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
138
			{
139
				return $this->applyFilters($match, $route->filters);
140
			}
141
			elseif ($this->autoFilter)
142
			{
143
				return $this->applyAutoFilter($match);
144
			}
145
			return $match;
146
		}
147
	}
148
}
149