@@ -85,14 +85,14 @@ public function generate($name, $parameters = array(), $absolute = false)
85
85
// the Route has a cache of its own and is not recompiled as long as it does not get modified
86
86
$ compiledRoute = $ route ->compile ();
87
87
88
- return $ this ->doGenerate ($ compiledRoute ->getVariables (), $ route ->getDefaults (), $ route ->getRequirements (), $ compiledRoute ->getTokens (), $ parameters , $ name , $ absolute );
88
+ return $ this ->doGenerate ($ compiledRoute ->getVariables (), $ route ->getDefaults (), $ route ->getRequirements (), $ compiledRoute ->getTokens (), $ parameters , $ name , $ absolute, $ compiledRoute -> getHostnameTokens () );
89
89
}
90
90
91
91
/**
92
92
* @throws MissingMandatoryParametersException When route has some missing mandatory parameters
93
93
* @throws InvalidParameterException When a parameter value is not correct
94
94
*/
95
- protected function doGenerate ($ variables , $ defaults , $ requirements , $ tokens , $ parameters , $ name , $ absolute )
95
+ protected function doGenerate ($ variables , $ defaults , $ requirements , $ tokens , $ parameters , $ name , $ absolute, $ hostnameTokens )
96
96
{
97
97
$ variables = array_flip ($ variables );
98
98
@@ -133,6 +133,25 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
133
133
$ url = '/ ' ;
134
134
}
135
135
136
+ if ($ hostnameTokens ) {
137
+ $ host = '' ;
138
+ foreach ($ hostnameTokens as $ token ) {
139
+ if ('variable ' === $ token [0 ]) {
140
+ if (in_array ($ tparams [$ token [3 ]], array (null , '' , false ), true )) {
141
+ // check requirement
142
+ if ($ tparams [$ token [3 ]] && !preg_match ('#^ ' .$ token [2 ].'$# ' , $ tparams [$ token [3 ]])) {
143
+ throw new InvalidParameterException (sprintf ('Parameter "%s" for route "%s" must match "%s" ("%s" given). ' , $ token [3 ], $ name , $ token [2 ], $ tparams [$ token [3 ]]));
144
+ }
145
+ }
146
+
147
+ $ host = $ token [1 ].$ tparams [$ token [3 ]].$ host ;
148
+
149
+ } elseif ('text ' === $ token [0 ]) {
150
+ $ host = $ token [1 ].$ host ;
151
+ }
152
+ }
153
+ }
154
+
136
155
// add a query string if needed
137
156
$ extra = array_diff_key ($ originParameters , $ variables , $ defaults );
138
157
if ($ extra && $ query = http_build_query ($ extra )) {
@@ -148,15 +167,24 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
148
167
$ scheme = $ req ;
149
168
}
150
169
170
+ if ($ hostnameTokens ) {
171
+ $ absolute = true ;
172
+ }
173
+
151
174
if ($ absolute ) {
175
+
176
+ if (!$ hostnameTokens ) {
177
+ $ host = $ this ->context ->getHost ();
178
+ }
179
+
152
180
$ port = '' ;
153
181
if ('http ' === $ scheme && 80 != $ this ->context ->getHttpPort ()) {
154
182
$ port = ': ' .$ this ->context ->getHttpPort ();
155
183
} elseif ('https ' === $ scheme && 443 != $ this ->context ->getHttpsPort ()) {
156
184
$ port = ': ' .$ this ->context ->getHttpsPort ();
157
185
}
158
186
159
- $ url = $ scheme .':// ' .$ this -> context -> getHost () .$ port .$ url ;
187
+ $ url = $ scheme .':// ' .$ host .$ port .$ url ;
160
188
}
161
189
}
162
190
0 commit comments