Skip to content

Commit 36a97a2

Browse files
committed
Merge pull request #78 from elnur/host-support
Add support for hosts
2 parents 8402516 + cbb1a97 commit 36a97a2

File tree

6 files changed

+59
-7
lines changed

6 files changed

+59
-7
lines changed

Extractor/ExposedRoutesExtractor.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace FOS\JsRoutingBundle\Extractor;
1313

14+
use Symfony\Component\Routing\Route;
1415
use Symfony\Component\Routing\RouterInterface;
1516
use JMS\I18nRoutingBundle\Router\I18nLoader;
1617

@@ -58,6 +59,7 @@ public function __construct(RouterInterface $router, array $routesToExpose = arr
5859
public function getRoutes()
5960
{
6061
$exposedRoutes = array();
62+
/** @var $route Route */
6163
foreach ($this->getExposedRoutes() as $name => $route) {
6264
// Maybe there is a better way to do that...
6365
$compiledRoute = $route->compile();
@@ -66,10 +68,12 @@ public function getRoutes()
6668
array_fill_keys($compiledRoute->getVariables(), null)
6769
);
6870
$requirements = $route->getRequirements();
71+
$host = method_exists($route, 'getHost') ? $route->getHost() : '';
6972
$exposedRoutes[$name] = new ExtractedRoute(
7073
$compiledRoute->getTokens(),
7174
$defaults,
72-
$requirements
75+
$requirements,
76+
$host
7377
);
7478
}
7579

Extractor/ExtractedRoute.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ class ExtractedRoute
1616
private $tokens;
1717
private $defaults;
1818
private $requirements;
19+
private $host;
1920

20-
public function __construct(array $tokens, array $defaults, array $requirements)
21+
public function __construct(array $tokens, array $defaults, array $requirements, $host = '')
2122
{
2223
$this->tokens = $tokens;
2324
$this->defaults = $defaults;
2425
$this->requirements = $requirements;
26+
$this->host = $host;
2527
}
2628

2729
public function getTokens()
@@ -38,4 +40,9 @@ public function getRequirements()
3840
{
3941
return $this->requirements;
4042
}
43+
44+
public function getHost()
45+
{
46+
return $this->host;
47+
}
4148
}

Resources/js/router.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,9 @@ fos.Router.prototype.generate = function(name, opt_params, absolute) {
206206

207207
url = this.context_.base_url + url;
208208
if (goog.object.containsKey(route.requirements, "_scheme") && this.getScheme() != route.requirements["_scheme"]) {
209-
url = route.requirements["_scheme"] + "://" + this.getHost() + url;
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;
210212
} else if (absolute === true) {
211213
url = this.getScheme() + "://" + this.getHost() + url;
212214
}

Resources/js/router.test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,45 @@ function testGenerateUsesSchemeRequirements() {
4848
assertEquals('https://localhost/foo/bar', router.generate('homepage'));
4949
}
5050

51+
function testGenerateUsesHost() {
52+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
53+
homepage: {
54+
tokens: [['text', '/bar']],
55+
defaults: {},
56+
requirements: {},
57+
host: 'otherhost'
58+
}
59+
});
60+
61+
assertEquals('http://otherhost/foo/bar', router.generate('homepage'));
62+
}
63+
64+
function testGenerateUsesHostWhenTheSameSchemeRequirementGiven() {
65+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
66+
homepage: {
67+
tokens: [['text', '/bar']],
68+
defaults: {},
69+
requirements: {"_scheme": "http"},
70+
host: 'otherhost'
71+
}
72+
});
73+
74+
assertEquals('http://otherhost/foo/bar', router.generate('homepage'));
75+
}
76+
77+
function testGenerateUsesHostWhenAnotherSchemeRequirementGiven() {
78+
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
79+
homepage: {
80+
tokens: [['text', '/bar']],
81+
defaults: {},
82+
requirements: {"_scheme": "https"},
83+
host: 'otherhost'
84+
}
85+
});
86+
87+
assertEquals('https://otherhost/foo/bar', router.generate('homepage'));
88+
}
89+
5190
function testGenerateUsesAbsoluteUrl() {
5291
var router = new fos.Router({base_url: '/foo', host: "localhost", scheme: "http"}, {
5392
homepage: {

Resources/public/js/router.js

Lines changed: 2 additions & 2 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()),
34+
'blog' => new ExtractedRoute(array(array('variable', '/', '[^/]+?', 'slug'), array('text', '/blog-post')), array(), array(), 'localhost'),
3535
))
3636
);
3737
$response = $controller->indexAction($this->getRequest('/'), 'json');
3838

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

4242
public function testGenerateWithCallback()

0 commit comments

Comments
 (0)