Skip to content

Commit d38e992

Browse files
committed
Merge pull request #81 from elnur/host-placeholders
Add support for placeholders in hosts
2 parents a972380 + 1db40b5 commit d38e992

File tree

7 files changed

+130
-43
lines changed

7 files changed

+130
-43
lines changed

Extractor/ExposedRoutesExtractor.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ public function getRoutes()
6868
array_fill_keys($compiledRoute->getVariables(), null)
6969
);
7070
$requirements = $route->getRequirements();
71-
$host = method_exists($route, 'getHost') ? $route->getHost() : '';
71+
$hostTokens = method_exists($compiledRoute, 'getHostTokens') ? $compiledRoute->getHostTokens() : array();
7272
$exposedRoutes[$name] = new ExtractedRoute(
7373
$compiledRoute->getTokens(),
7474
$defaults,
7575
$requirements,
76-
$host
76+
$hostTokens
7777
);
7878
}
7979

Extractor/ExtractedRoute.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ class ExtractedRoute
1616
private $tokens;
1717
private $defaults;
1818
private $requirements;
19-
private $host;
19+
private $hosttokens;
2020

21-
public function __construct(array $tokens, array $defaults, array $requirements, $host = '')
21+
public function __construct(array $tokens, array $defaults, array $requirements, array $hosttokens = array())
2222
{
2323
$this->tokens = $tokens;
2424
$this->defaults = $defaults;
2525
$this->requirements = $requirements;
26-
$this->host = $host;
26+
$this->hosttokens = $hosttokens;
2727
}
2828

2929
public function getTokens()
@@ -41,8 +41,8 @@ public function getRequirements()
4141
return $this->requirements;
4242
}
4343

44-
public function getHost()
44+
public function getHosttokens()
4545
{
46-
return $this->host;
46+
return $this->hosttokens;
4747
}
4848
}

Resources/js/externs.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
var externs = {
66
tokens: '',
77
defaults: '',
8-
requirements: ''
9-
};
8+
requirements: '',
9+
hosttokens: ''
10+
};

Resources/js/router.js

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,13 @@ fos.Router.prototype.getRoute = function(name) {
149149
* @return {string}
150150
*/
151151
fos.Router.prototype.generate = function(name, opt_params, absolute) {
152-
var route = (this.getRoute(name));
153-
var params = opt_params || {};
154-
var unusedParams = goog.object.clone(params);
155-
var url = '';
156-
var optional = true;
152+
var route = (this.getRoute(name)),
153+
params = opt_params || {},
154+
unusedParams = goog.object.clone(params),
155+
url = '',
156+
optional = true,
157+
host = '';
158+
157159
goog.array.forEach(route.tokens, function(token) {
158160
if ('text' === token[0]) {
159161
url = token[1] + url;
@@ -204,11 +206,32 @@ fos.Router.prototype.generate = function(name, opt_params, absolute) {
204206
url = '/';
205207
}
206208

209+
goog.array.forEach(route.hosttokens, function (token) {
210+
var value;
211+
212+
if ('text' === token[0]) {
213+
host = token[1] + host;
214+
215+
return;
216+
}
217+
218+
if ('variable' === token[0]) {
219+
if (goog.object.containsKey(params, token[3])) {
220+
value = params[token[3]];
221+
goog.object.remove(unusedParams, token[3]);
222+
} else if (goog.object.containsKey(route.defaults, token[3])) {
223+
value = route.defaults[token[3]];
224+
}
225+
226+
host = token[1] + value + host;
227+
}
228+
});
229+
207230
url = this.context_.base_url + url;
208231
if (goog.object.containsKey(route.requirements, "_scheme") && this.getScheme() != route.requirements["_scheme"]) {
209-
url = route.requirements["_scheme"] + "://" + (route.host || this.getHost()) + url;
210-
} else if (route.host && this.getHost() !== route.host) {
211-
url = this.getScheme() + "://" + route.host + url;
232+
url = route.requirements["_scheme"] + "://" + (host || this.getHost()) + url;
233+
} else if (host && this.getHost() !== host) {
234+
url = this.getScheme() + "://" + host + url;
212235
} else if (absolute === true) {
213236
url = this.getScheme() + "://" + this.getHost() + url;
214237
}

Resources/js/router.test.js

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ function testGenerate() {
55
literal: {
66
tokens: [['text', '/homepage']],
77
defaults: {},
8-
requirements: {}
8+
requirements: {},
9+
hosttokens: []
910
}
1011
});
1112

@@ -17,7 +18,8 @@ function testGenerateWithParams() {
1718
blog_post: {
1819
tokens: [['variable', '/', '[^/]+?', 'slug'], ['text', '/blog-post']],
1920
defaults: {},
20-
requirements: {}
21+
requirements: {},
22+
hosttokens: []
2123
}
2224
});
2325

@@ -29,7 +31,8 @@ function testGenerateUsesBaseUrl() {
2931
homepage: {
3032
tokens: [['text', '/bar']],
3133
defaults: {},
32-
requirements: {}
34+
requirements: {},
35+
hosttokens: []
3336
}
3437
});
3538

@@ -41,7 +44,8 @@ function testGenerateUsesSchemeRequirements() {
4144
homepage: {
4245
tokens: [['text', '/bar']],
4346
defaults: {},
44-
requirements: {"_scheme": "https"}
47+
requirements: {"_scheme": "https"},
48+
hosttokens: []
4549
}
4650
});
4751

@@ -54,7 +58,7 @@ function testGenerateUsesHost() {
5458
tokens: [['text', '/bar']],
5559
defaults: {},
5660
requirements: {},
57-
host: 'otherhost'
61+
hosttokens: [['text', 'otherhost']]
5862
}
5963
});
6064

@@ -67,7 +71,7 @@ function testGenerateUsesHostWhenTheSameSchemeRequirementGiven() {
6771
tokens: [['text', '/bar']],
6872
defaults: {},
6973
requirements: {"_scheme": "http"},
70-
host: 'otherhost'
74+
hosttokens: [['text', 'otherhost']]
7175
}
7276
});
7377

@@ -80,19 +84,68 @@ function testGenerateUsesHostWhenAnotherSchemeRequirementGiven() {
8084
tokens: [['text', '/bar']],
8185
defaults: {},
8286
requirements: {"_scheme": "https"},
83-
host: 'otherhost'
87+
hosttokens: [['text', 'otherhost']]
8488
}
8589
});
8690

8791
assertEquals('https://otherhost/foo/bar', router.generate('homepage'));
8892
}
8993

94+
function testGenerateSupportsHostPlaceholders() {
95+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
96+
homepage: {
97+
tokens: [['text', '/bar']],
98+
defaults: {},
99+
requirements: {},
100+
hosttokens: [
101+
['text', '.localhost'],
102+
['variable', '', '', 'subdomain']
103+
]
104+
}
105+
});
106+
107+
assertEquals('http://api.localhost/foo/bar', router.generate('homepage', {subdomain: 'api'}));
108+
}
109+
110+
function testGenerateSupportsHostPlaceholdersDefaults() {
111+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
112+
homepage: {
113+
tokens: [['text', '/bar']],
114+
defaults: {subdomain: 'api'},
115+
requirements: {},
116+
hosttokens: [
117+
['text', '.localhost'],
118+
['variable', '', '', 'subdomain']
119+
]
120+
}
121+
});
122+
123+
assertEquals('http://api.localhost/foo/bar', router.generate('homepage'));
124+
}
125+
126+
function testGenerateGeneratesRelativePathWhenTheSameHostGiven() {
127+
var router = new fos.Router({base_url: '/foo', host: "api.localhost", scheme: "http"}, {
128+
homepage: {
129+
tokens: [['text', '/bar']],
130+
defaults: {},
131+
requirements: {},
132+
hosttokens: [
133+
['text', '.localhost'],
134+
['variable', '', '', 'subdomain']
135+
]
136+
}
137+
});
138+
139+
assertEquals('/foo/bar', router.generate('homepage', {subdomain: 'api'}));
140+
}
141+
90142
function testGenerateUsesAbsoluteUrl() {
91143
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
92144
homepage: {
93145
tokens: [['text', '/bar']],
94146
defaults: {},
95-
requirements: {}
147+
requirements: {},
148+
hosttokens: []
96149
}
97150
});
98151

@@ -104,7 +157,8 @@ function testGenerateUsesAbsoluteUrlWhenSchemeRequirementGiven() {
104157
homepage: {
105158
tokens: [['text', '/bar']],
106159
defaults: {},
107-
requirements: {"_scheme": "http"}
160+
requirements: {"_scheme": "http"},
161+
hosttokens: []
108162
}
109163
});
110164

@@ -116,7 +170,8 @@ function testGenerateWithOptionalTrailingParam() {
116170
posts: {
117171
tokens: [['variable', '.', '', '_format'], ['text', '/posts']],
118172
defaults: {},
119-
requirements: {}
173+
requirements: {},
174+
hosttokens: []
120175
}
121176
});
122177

@@ -129,7 +184,8 @@ function testGenerateQueryStringWithoutDefaults() {
129184
posts: {
130185
tokens: [['variable', '/', '[1-9]+[0-9]*', 'page'], ['text', '/blog-posts']],
131186
defaults: {'page' : 1},
132-
requirements: {}
187+
requirements: {},
188+
hosttokens: []
133189
}
134190
});
135191

@@ -141,7 +197,8 @@ function testAllowSlashes() {
141197
posts: {
142198
tokens: [['variable', '/', '.+', 'id'], ['text', '/blog-post']],
143199
defaults: {},
144-
requirements: {}
200+
requirements: {},
201+
hosttokens: []
145202
}
146203
});
147204

@@ -153,7 +210,8 @@ function testGenerateWithExtraParams() {
153210
foo: {
154211
tokens: [['variable', '/', '', 'bar']],
155212
defaults: {},
156-
requirements: {}
213+
requirements: {},
214+
hosttokens: []
157215
}
158216
});
159217

@@ -168,7 +226,8 @@ function testGenerateWithExtraParamsDeep() {
168226
foo: {
169227
tokens: [['variable', '/', '', 'bar']],
170228
defaults: {},
171-
requirements: {}
229+
requirements: {},
230+
hosttokens: []
172231
}
173232
});
174233

@@ -226,17 +285,20 @@ function testGeti18n() {
226285
en__RG__homepage: {
227286
tokens: [['text', '/bar']],
228287
defaults: {},
229-
requirements: {}
288+
requirements: {},
289+
hosttokens: []
230290
},
231291
es__RG__homepage: {
232292
tokens: [['text', '/es/bar']],
233293
defaults: {},
234-
requirements: {}
294+
requirements: {},
295+
hosttokens: []
235296
},
236297
_admin: {
237298
tokens: [['text', '/admin']],
238299
defaults: {},
239-
requirements: {}
300+
requirements: {},
301+
hosttokens: []
240302
}
241303
});
242304

@@ -277,7 +339,8 @@ function testGenerateWithNullValue() {
277339
['text', '/blog-post']
278340
],
279341
defaults: {},
280-
requirements: {}
342+
requirements: {},
343+
hosttokens: []
281344
}
282345
});
283346

Resources/public/js/router.js

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tests/Controller/ControllerTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ public function testIndexAction()
3131
$this->getSerializer(),
3232
$this->getExtractor(array(
3333
'literal' => new ExtractedRoute(array(array('text', '/homepage')), array(), array()),
34-
'blog' => new ExtractedRoute(array(array('variable', '/', '[^/]+?', 'slug'), array('text', '/blog-post')), array(), array(), 'localhost'),
34+
'blog' => new ExtractedRoute(array(array('variable', '/', '[^/]+?', 'slug'), array('text', '/blog-post')), array(), array(), array(array('text', 'localhost'))),
3535
))
3636
);
3737
$response = $controller->indexAction($this->getRequest('/'), 'json');
3838

39-
$this->assertEquals('{"base_url":"","routes":{"literal":{"tokens":[["text","\/homepage"]],"defaults":[],"requirements":[],"host":""},"blog":{"tokens":[["variable","\/","[^\/]+?","slug"],["text","\/blog-post"]],"defaults":[],"requirements":[],"host":"localhost"}},"prefix":"","host":"","scheme":""}', $response->getContent());
39+
$this->assertEquals('{"base_url":"","routes":{"literal":{"tokens":[["text","\/homepage"]],"defaults":[],"requirements":[],"hosttokens":[]},"blog":{"tokens":[["variable","\/","[^\/]+?","slug"],["text","\/blog-post"]],"defaults":[],"requirements":[],"hosttokens":[["text","localhost"]]}},"prefix":"","host":"","scheme":""}', $response->getContent());
4040
}
4141

4242
public function testGenerateWithCallback()

0 commit comments

Comments
 (0)