2 declare(strict_types = 1);
19 use Psr\Http\Message\ServerRequestInterface;
20 use Symfony\Component\Routing\Exception\NoConfigurationException;
21 use Symfony\Component\Routing\Exception\ResourceNotFoundException;
22 use Symfony\Component\Routing\Matcher\UrlMatcher;
23 use Symfony\Component\Routing\RequestContext;
71 $this->finder =
$finder ?? GeneralUtility::makeInstance(SiteFinder::class);
72 $this->pseudoSiteFinder = GeneralUtility::makeInstance(PseudoSiteFinder::class);
86 GeneralUtility::makeInstance(CacheManager::class)->getCache(
'cache_rootline')->flush();
87 $this->pseudoSiteFinder = GeneralUtility::makeInstance(PseudoSiteFinder::class);
88 $this->pseudoSiteFinder->refresh();
108 $defaultLanguage =
null;
110 $pageId = $request->getQueryParams()[
'id'] ?? $request->getParsedBody()[
'id'] ?? 0;
113 $pageId = (int)GeneralUtility::makeInstance(PageRepository::class)->getPageIdFromAlias($pageId);
119 $site = $this->finder->getSiteByPageId((
int)$pageId);
121 $languageId = $request->getQueryParams()[
'L'] ?? $request->getParsedBody()[
'L'] ??
null;
122 if ($languageId !==
null) {
123 $language = $site->getLanguageById((
int)$languageId);
126 $defaultLanguage = $site->getDefaultLanguage();
130 }
catch (\InvalidArgumentException $e) {
141 $context =
new RequestContext(
143 $request->getMethod(),
145 $request->getUri()->getScheme(),
149 $request->getUri()->getPath()
151 $matcher =
new UrlMatcher($collection, $context);
153 $result = $matcher->match($request->getUri()->getPath());
160 $result[
'language'] ?? $defaultLanguage,
163 }
catch (NoConfigurationException | ResourceNotFoundException $e) {
175 $context =
new RequestContext(
'/', $request->getMethod(), $request->getUri()->getHost());
176 $matcher =
new UrlMatcher($collection, $context);
177 if ((
bool)
$GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'recursiveDomainSearch']) {
178 $host = explode(
'.', $request->getUri()->getHost());
179 while (count($host)) {
180 $context->setHost(implode(
'.', $host));
182 $result = $matcher->match($request->getUri()->getPath());
189 }
catch (NoConfigurationException | ResourceNotFoundException $e) {
195 $result = $matcher->match($request->getUri()->getPath());
196 return new SiteRouteResult($request->getUri(), $result[
'site'], $result[
'language'], $result[
'tail']);
197 }
catch (NoConfigurationException | ResourceNotFoundException $e) {
205 $site = $this->pseudoSiteFinder->getSiteByPageId((
int)$pageId);
208 $allPseudoSites = $this->pseudoSiteFinder->findAll();
209 $site = reset($allPseudoSites);
226 return $this->finder->getSiteByPageId($pageId, $rootLine);
229 return $this->pseudoSiteFinder->getSiteByPageId($pageId, $rootLine);
241 foreach ($this->finder->getAllSites() as $site) {
243 $uri = $site->getBase();
245 ($uri->getPath() ?:
'/') .
'{tail}',
246 [
'site' => $site,
'language' =>
null,
'tail' =>
''],
247 array_filter([
'tail' =>
'.*',
'port' => (
string)$uri->getPort()]),
249 $uri->getHost() ?:
'',
252 $identifier =
'site_' . $site->getIdentifier();
253 $groupedRoutes[($uri->getScheme() ?:
'-') . ($uri->getHost() ?:
'-')][$uri->getPath() ?:
'/'][$identifier] = $route;
255 foreach ($site->getAllLanguages() as $siteLanguage) {
256 $uri = $siteLanguage->getBase();
258 ($uri->getPath() ?:
'/') .
'{tail}',
259 [
'site' => $site,
'language' => $siteLanguage,
'tail' =>
''],
260 array_filter([
'tail' =>
'.*',
'port' => (
string)$uri->getPort()]),
265 $identifier =
'site_' . $site->getIdentifier() .
'_' . $siteLanguage->getLanguageId();
266 $groupedRoutes[($uri->getScheme() ?:
'-') . ($uri->getHost() ?:
'-')][$uri->getPath() ?:
'/'][$identifier] = $route;
281 $sites = $this->pseudoSiteFinder->findAll();
283 foreach ($sites as $site) {
287 foreach ($site->getEntryPoints() as $uri) {
290 if (!$uri->getHost()) {
294 ($uri->getPath() ?:
'/') .
'{tail}',
295 [
'site' => $site,
'language' =>
null,
'tail' =>
''],
296 array_filter([
'tail' =>
'.*',
'port' => (
string)$uri->getPort()]),
301 $identifier =
'site_' . $site->getIdentifier() .
'_' . (string)$uri;
302 $groupedRoutes[($uri->getScheme() ?:
'-') . ($uri->getHost() ?:
'-')][$uri->getPath() ?:
'/'][$identifier] = $route;
319 krsort($groupedRoutes);
320 foreach ($groupedRoutes as $groupedRoutesPerHost) {
321 krsort($groupedRoutesPerHost);
322 foreach ($groupedRoutesPerHost as $groupedRoutesPerPath) {
323 krsort($groupedRoutesPerPath);
324 foreach ($groupedRoutesPerPath as $identifier => $route) {
325 $collection->add($identifier, $route);