-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[2.2][Routing] hostname pattern for routes #3378
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@Koc yes, the main difference is that this PR allows variables in the hostname pattern, with requirements, etc just like the path pattern. The other PRs use a
If you have multiple tlds you can easily do it like this: hostbased_route:
pattern: /
hostname_pattern: symfony.{tld}
requirements:
tld: org|com Or with completely different domain names: hostbased_route:
pattern: /
hostname_pattern: {domain}
requirements:
domain: example\.com|symfony\.com Requirements allow DIC %parameters%, so you can also put you domains in your config.yml. |
wow, nice! So looks like this PR closes my #3276 ticket? |
Yes, apparently :) |
I cann't find method |
I think it's in core already |
Well, we already have 2 other implementations for this stuff in the PRs. @fabpot please take time to look at them |
This one is absolutely not tested and seems to break the existing tests according to the description. So it cannot be reviewed as is. |
@stof I understand it's a WIP but the other PRs where ignored as well and like you've said, there's a bunch of PRs already on this issue all doing a thing or another. So an early feedback on this, or any other, could lead it to the right path in order to finally solve this issue. |
Added tests; others are passing now |
@arnaud-lb We need to wait @fabpot's mind about the way he prefers to implement it to know which one can be merged. |
Forked @arnaud-lb hostname_pattern to add XML parasing support. |
@arnaud-lb Please rebase your branch. It conflicts with master because of the move of the tests |
Hi, If @arnaud-lb won't be able to rebase this I could help with some work on this but there's still the problem of actually choosing the right PR(s) for this issue. @blogsh says in his last commit that this PR is a bit better in his opinion but @fabpot needs to decide in the end. |
@stof rebased |
@fabpot Any final word about this pull request? It would be nice to have this feature ready for 2.1. |
Using the Another thing I'm wondering is how/if it should be possible to set the hostname pattern for all your routes, or at least when importing routes? Otherwise you'll end up repeating the same host pattern over and over again. I think this is also important when importing routes from third party bundles. |
I'm reviewing this PR and I'm going to make some modifications. I will send a PR to @arnaud-lb soon. |
I've sent a PR to @arnaud-lb arnaud-lb#3 that fixes some minor bugs and add support in more classes. |
Placeholders in the hostname are managed in the same way as the ones from the URL pattern. You can set a hostname pattern for a collection (like the prefix for URL patterns). |
I think we need to change the contents of $variables, $tokens, and $hostnameTokens in the CompiledRoute. They contain redundant information and the content structure of these variables ist not documentation in any way. If we remove duplicated content and put it in a (single) well defined variable, it would also reduce the information that need to be saved in the generated class by the UrlGeneratorDumper. |
$this->addRoute($route); | ||
return $this; | ||
|
||
} else if ('' === $this->getPrefix() || 0 === strpos($prefix, $this->getPrefix())) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no need for elseif, previous statement returns
@wendigo But there is one thing that would definitely be helpful: try to use this feature in your code and give us some feedback. |
@fabpot: It's the discussion on on outdated diff at 2012-11-11T06:56:27-08:00 |
fix API of RouteCollection
@fabpot now it's ready to be merged. |
Awesome. This is like Christmas if Santa brought code instead of presents. |
Not sure if the sample at the top is up to date (didn't read the gazillion comments) but can I ask why |
@Seldaek the hostname pattern allows |
I see, then I agree it might not belong in requirements, but still not sure hostname vs hostname_pattern.. The |
I also raised this question. But since it's |
@fabpot Are you going to wait for the discussion on that issue before merging this? |
This PR was merged into the master branch. Commits ------- 17f51a1 Merge pull request #6 from Tobion/hostname-routes e120a7a fix API of RouteCollection 26e5684 some type fixes 514e27a [Routing] fix PhpMatcherDumper that returned numeric-indexed params that are returned besides named placeholders by preg_match 7ed3013 switch to array_replace instead of array_merge 94ec653 removed irrelevant string case in XmlFileLoader 9ffe3de synchronize the fixtures in different formats and fix default for numeric requirement 6cd3457 fixed CS 8366b8a [Routing] fixed validity check for hostname params in UrlGenerator a8ce621 [Routing] added support for hostname in the apache matcher dumper 562174a [Routing] fixed indentation of dumped collections 1489021 fixed CS a270458 [Routing] added some more unit tests 153fcf2 [Routing] added some unit tests for the PHP loader 68da6ad [Routing] added support for hostname in the XML loader 3dfca47 [Routing] added some unit tests for the YAML loader 92f9c15 [Routing] changed CompiledRoute signature to be more consistent d91e5a2 [Routing] fixed Route annotation for hostname (should be hostname_pattern instead of hostnamePattern) 62de881 [Routing] clarified a variable content 11b4378 [Routing] added hostname support in UrlMatcher fc015d5 [Routing] fixed route generation with a hostname pattern when the hostname is the same as the current one (no need to force the generated URL to be absolute) 462999d [Routing] display hostname pattern in router:debug output 805806a [Routing] added hostname matching support to UrlGenerator 7a15e00 [Routing] added hostname matching support to AnnotationClassLoader cab450c [Routing] added hostname matching support to YamlFileLoader 85d11af [Routing] added hostname matching support to PhpMatcherDumper 402359b [Routing] added hostname matching support to RouteCompiler add3658 [Routing] added hostname matching support to Route and RouteCollection 23feb37 [Routing] added hostname matching support to CompiledRoute Discussion ---------- [2.2][Routing] hostname pattern for routes Bug fix: no Feature addition: yes Fixes the following tickets: #1762, #3276 Backwards compatibility break: no Symfony2 tests pass: yes This adds a hostname_pattern property to routes. It works like the pattern property (hostname_pattern can have variables, requirements, etc). The hostname_pattern property can be set on both routes and route collections. Yaml example: ``` yaml # Setting the hostname_pattern for a whole collection of routes AcmeBundle: resource: "@AcmeBundle/Controller/" type: annotation prefix: / hostname_pattern: {locale}.example.com requirements: locale: en|fr # Setting the hostname_pattern for single route some_route: pattern: /hello/{name} hostname_pattern: {locale}.example.com requirements: locale: en|fr name: \w+ defaults: _controller: Foo:bar:baz ``` Annotations example: ``` php <?php /** * Inherits requirements and hostname pattern from the collection * @route("/foo") */ public function fooAction(); /** * Set a specific hostnamePattern for this route only * @route("/foo", hostnamePattern="{_locale}.example.com", requirements={"_locale="fr|en"}) */ public function fooAction(); ``` Performance: Consecutive routes with the same hostname pattern are grouped, and a single test is made against the hostname for this group, so the overhead is very low: ``` @route("/foo", hostnamePattern="a.example.com") @route("/bar", hostnamePattern="a.example.com") @route("/baz", hostnamePattern="b.example.com") ``` is compiled like this: ``` if (hostname matches a.example.com) { // test route "/foo" // test route "/bar" } if (hostname matches b.example.com) { // test route "/baz" } ``` The PR also tries harder to optimize routes sharing the same prefix: ``` @route("/cafe") @route("/cacao") @route("/coca") ``` is compiled like this: ``` if (url starts with /c) { if (url starts with /ca) { // test route "/cafe" // test route "/cacao" } // test route "/coca" } ``` --------------------------------------------------------------------------- by Koc at 2012-02-16T14:14:19Z Interesting. Have you looked at #3057, #3002? Killer feature of #3057 : multiple hostnames per route. --------------------------------------------------------------------------- by arnaud-lb at 2012-02-16T14:21:28Z @Koc yes, the main difference is that this PR allows variables in the hostname pattern, with requirements, etc just like the path pattern. The other PRs use a `_host` requirement, which works like the `_method` requirement (takes a list of allowed hostnames separated by `|`). > Killer feature of #3057 : multiple hostnames per route. If you have multiple tlds you can easily do it like this: ``` yaml hostbased_route: pattern: / hostname_pattern: symfony.{tld} requirements: tld: org|com ``` Or with completely different domain names: ``` yaml hostbased_route: pattern: / hostname_pattern: {domain} requirements: domain: example\.com|symfony\.com ``` Requirements allow DIC %parameters%, so you can also put you domains in your config.yml. --------------------------------------------------------------------------- by Koc at 2012-02-16T15:52:16Z wow, nice! So looks like this PR closes my #3276 ticket? --------------------------------------------------------------------------- by arnaud-lb at 2012-02-16T15:53:55Z Yes, apparently :) --------------------------------------------------------------------------- by Koc at 2012-02-16T15:56:53Z I cann't find method `ParameterBag::resolveValue` calling in this PR, like here https://github.com/symfony/symfony/pull/3316/files --------------------------------------------------------------------------- by arnaud-lb at 2012-02-16T16:03:48Z I think it's in core already --------------------------------------------------------------------------- by Koc at 2012-02-16T16:11:38Z looks like yes https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php#L81 --------------------------------------------------------------------------- by dlsniper at 2012-02-16T19:37:57Z This PR looks great, it's something like this I've been waiting for. I know @fabpot said he's working on something similar but I think if he agrees with this it could be a great addition to the core. @fabpot , @stof any objections about this PR if gets fully done? --------------------------------------------------------------------------- by stof at 2012-02-16T20:00:21Z Well, we already have 2 other implementations for this stuff in the PRs. @fabpot please take time to look at them --------------------------------------------------------------------------- by stof at 2012-02-16T20:03:17Z This one is absolutely not tested and seems to break the existing tests according to the description. So it cannot be reviewed as is. --------------------------------------------------------------------------- by dlsniper at 2012-02-16T22:00:24Z @stof I understand it's a WIP but the other PRs where ignored as well and like you've said, there's a bunch of PRs already on this issue all doing a thing or another. So an early feedback on this, or any other, could lead it to the right path in order to finally solve this issue. --------------------------------------------------------------------------- by arnaud-lb at 2012-02-17T23:57:28Z Added tests; others are passing now --------------------------------------------------------------------------- by arnaud-lb at 2012-02-22T21:10:20Z I'm going to add support for the Apache dumper and the XML loader; does this PR have a chance to be merged ? cc @fabpot @stof --------------------------------------------------------------------------- by stof at 2012-02-22T22:05:23Z @arnaud-lb We need to wait @fabpot's mind about the way he prefers to implement it to know which one can be merged. --------------------------------------------------------------------------- by IjinPL at 2012-02-27T02:01:57Z Forked @arnaud-lb *hostname_pattern* to add XML parasing support. --------------------------------------------------------------------------- by stof at 2012-04-03T23:59:12Z @arnaud-lb Please rebase your branch. It conflicts with master because of the move of the tests @fabpot @vicb ping --------------------------------------------------------------------------- by dlsniper at 2012-04-13T19:52:23Z Hi, If @arnaud-lb won't be able to rebase this I could help with some work on this but there's still the problem of actually choosing the right PR(s) for this issue. @blogsh says in his last commit that this PR is a bit better in his opinion but @fabpot needs to decide in the end. --------------------------------------------------------------------------- by arnaud-lb at 2012-04-14T17:26:55Z @stof rebased --------------------------------------------------------------------------- by nomack84 at 2012-04-20T13:01:00Z @fabpot Any final word about this pull request? It would be nice to have this feature ready for 2.1. --------------------------------------------------------------------------- by asm89 at 2012-04-24T21:27:50Z Using the `{_locale}` placeholder in the host would set the locale for the request just like it does now? Another thing I'm wondering is how/if it should be possible to set the hostname pattern for all your routes, or at least when importing routes? Otherwise you'll end up repeating the same host pattern over and over again. I think this is also important when importing routes from third party bundles. --------------------------------------------------------------------------- by fabpot at 2012-04-25T01:17:51Z I'm reviewing this PR and I'm going to make some modifications. I will send a PR to @arnaud-lb soon. --------------------------------------------------------------------------- by fabpot at 2012-04-25T03:10:18Z I've sent a PR to @arnaud-lb arnaud-lb#3 that fixes some minor bugs and add support in more classes. --------------------------------------------------------------------------- by fabpot at 2012-04-25T03:12:52Z @asm89: Placeholders in the hostname are managed in the same way as the ones from the URL pattern. You can set a hostname pattern for a collection (like the prefix for URL patterns). --------------------------------------------------------------------------- by Tobion at 2012-04-25T09:31:19Z I think we need to change the contents of $variables, $tokens, and $hostnameTokens in the CompiledRoute. They contain redundant information and the content structure of these variables ist not documentation in any way. If we remove duplicated content and put it in a (single) well defined variable, it would also reduce the information that need to be saved in the generated class by the UrlGeneratorDumper. --------------------------------------------------------------------------- by arnaud-lb at 2012-04-26T08:54:21Z @fabpot thanks :) I've merged it --------------------------------------------------------------------------- by stof at 2012-04-26T12:08:40Z A rebase is needed --------------------------------------------------------------------------- by fabpot at 2012-04-26T13:28:08Z no need to rebase, I will resolve the conflicts when merging. I've still have some minor changes to do before merging though. Anyone willing to have a look at implementing the Apache dumper part? --------------------------------------------------------------------------- by Tobion at 2012-04-26T14:59:00Z @fabpot you want to merge this for 2.1 although it introduces big changes that need extensive review and testing? But #3958 is not considered for 2.1? I thought we are in some sort of feature freeze for the components in order to not postpone the release. --------------------------------------------------------------------------- by fabpot at 2012-04-26T17:21:09Z @Tobion: I never said it will be in 2.1. The plan is to create a 2.1 branch soon so that we can continue working on 2.2. --------------------------------------------------------------------------- by Koc at 2012-04-26T19:46:43Z https://twitter.com/#!/fabpot/status/178502663690915840
Merged! Thanks you very much to everyone who participated in this PR, especially @arnaud-lb and @Tobion. Enjoy! |
Thanks! |
Thank you for this awesome feature @arnaud-lb @Tobion and everyone else! |
THANKS! |
Any chance I can use this feature on symfony 2.1? I really need this feature and can't wait for 2.2. I want to change this: domain.com/username (my current route) to: username.domain.com (how I want routing to work) Of course I've a wildcard on my dns so all the traffic from subdomains goes to the same server. That works. Thanks! |
@bitomule: you can use apache redirects (RewriteCond and RewriteRule) in the mean time to get this accomplished |
I'm trying to use apache redirects, but that changes my browser url. This are my apache conditions and rules:
Thanks! |
@bitomule: and this RewriteRule isn't being matched? |
try something like this:
|
The RewriteRule is matched, but it changes browser url, I don't want that url to change. @philipphoffmann , yours doesn't even work :( |
try replacing the + in RewriteRule with *****, like this:
|
@bitomule , you're making rewrite to an absolute URL with another hostname, that's why Apache performs an external redirect. To avoid this, use an URL-path, or try the proxy flag:
|
Thanks for all your help, but it doesn't work :( I've tryed @philipphoffmann version and both @lazyhammer options so maybe my problem is in other part of the virtual host, so I paste the full virtualhost configuration. This is my virtualhost configuration, the one that works but changes url:
|
I'm finally waiting for symfony 2.2. When would symfony 2.2 be released? How can I update to beta? Should I? Thanks! |
Is there a plan to use the hostname in the Symfony2 Firewall (security.yml)? Example: security:
firewalls:
example:
pattern: ^/example
host: ^user.example.com$ @bitomule: Symfony 2.2 will be released at the end of February 2013 (http://symfony.com/doc/current/contributing/community/releases.html#schedule). Update your requirements in the composer.json to 2.2 and run |
Bug fix: no
Feature addition: yes
Fixes the following tickets: #1762, #3276
Backwards compatibility break: no
Symfony2 tests pass: yes
This adds a hostname_pattern property to routes. It works like the pattern property (hostname_pattern can have variables, requirements, etc). The hostname_pattern property can be set on both routes and route collections.
Yaml example:
Annotations example:
Performance:
Consecutive routes with the same hostname pattern are grouped, and a single test is made against the hostname for this group, so the overhead is very low:
is compiled like this:
The PR also tries harder to optimize routes sharing the same prefix:
is compiled like this: