‪TYPO3CMS  10.4
PageRouter.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ServerRequestInterface;
21 use Psr\Http\Message\UriInterface;
22 use Symfony\Component\Routing\Exception\MissingMandatoryParametersException;
23 use Symfony\Component\Routing\Exception\ResourceNotFoundException;
24 use Symfony\Component\Routing\RequestContext;
44 
71 {
75  protected ‪$site;
76 
80  protected ‪$enhancerFactory;
81 
85  protected ‪$aspectFactory;
86 
91 
95  protected ‪$context;
96 
103  public function ‪__construct(‪Site ‪$site, ‪Context ‪$context = null)
104  {
105  $this->site = ‪$site;
106  $this->context = ‪$context ?? GeneralUtility::makeInstance(Context::class);
107  $this->enhancerFactory = GeneralUtility::makeInstance(EnhancerFactory::class);
108  $this->aspectFactory = GeneralUtility::makeInstance(AspectFactory::class, $this->context);
109  $this->cacheHashCalculator = GeneralUtility::makeInstance(CacheHashCalculator::class);
110  }
111 
120  public function ‪matchRequest(ServerRequestInterface $request, ‪RouteResultInterface $previousResult = null): ‪RouteResultInterface
121  {
122  if (!($previousResult instanceof ‪RouteResultInterface)) {
123  throw new ‪RouteNotFoundException('No previous result given. Cannot find a page for an empty route part', 1555303496);
124  }
125 
126  $candidateProvider = $this->‪getSlugCandidateProvider($this->context);
127 
128  // Legacy URIs (?id=12345) takes precedence, no matter if a route is given
129  $requestId = (int)($request->getQueryParams()['id'] ?? 0);
130  if ($requestId > 0) {
131  if (!empty($pageId = $candidateProvider->getRealPageIdForPageIdAsPossibleCandidate($requestId))) {
132  return new PageArguments(
133  (int)$pageId,
134  (string)($request->getQueryParams()['type'] ?? '0'),
135  [],
136  [],
137  $request->getQueryParams()
138  );
139  }
140  throw new RouteNotFoundException('The requested page does not exist.', 1557839801);
141  }
142 
143  $urlPath = $previousResult->getTail();
144  // Remove the script name (e.g. index.php), if given
145  if (!empty($urlPath)) {
146  $normalizedParams = $request->getAttribute('normalizedParams');
147  if ($normalizedParams instanceof NormalizedParams) {
148  $scriptName = ltrim($normalizedParams->getScriptName(), '/');
149  if ($scriptName !== '' && strpos($urlPath, $scriptName) !== false) {
150  $urlPath = str_replace($scriptName, '', $urlPath);
151  }
152  }
153  }
154 
155  $language = $previousResult->getLanguage();
156  // Keep possible existing "/" at the end (no trim, just ltrim), even though the page slug might not
157  // contain a "/" at the end. This way we find page candidates where pages MIGHT have a trailing slash
158  // and pages with slugs that do not have a trailing slash
159  // $pageCandidates will contain more records than expected, which is important here, as the ->match() method
160  // will handle this then.
161  // The prepended slash will ensure that the root page of the site tree will also be fetched
162  $prefixedUrlPath = '/' . ltrim($urlPath, '/');
163 
164  $pageCandidates = $candidateProvider->getCandidatesForPath($prefixedUrlPath, $language);
165 
166  // Stop if there are no candidates
167  if (empty($pageCandidates)) {
168  throw new RouteNotFoundException('No page candidates found for path "' . $prefixedUrlPath . '"', 1538389999);
169  }
170 
171  $fullCollection = new RouteCollection();
172  foreach ($pageCandidates ?? [] as $page) {
173  $pageIdForDefaultLanguage = (int)($page['l10n_parent'] ?: $page['uid']);
174  $pagePath = $page['slug'];
175  $pageCollection = new RouteCollection();
176  $defaultRouteForPage = new Route(
177  $pagePath,
178  [],
179  [],
180  ['utf8' => true, '_page' => $page]
181  );
182  $pageCollection->add('default', $defaultRouteForPage);
183  $enhancers = $this->‪getEnhancersForPage($pageIdForDefaultLanguage, $language);
184  foreach ($enhancers as $enhancer) {
185  if ($enhancer instanceof DecoratingEnhancerInterface) {
186  $enhancer->decorateForMatching($pageCollection, $urlPath);
187  }
188  }
189  foreach ($enhancers as $enhancer) {
190  if ($enhancer instanceof RoutingEnhancerInterface) {
191  $enhancer->enhanceForMatching($pageCollection);
192  }
193  }
194 
195  $collectionPrefix = 'page_' . $page['uid'];
196  // Pages with a MountPoint Parameter means that they have a different context, and should be treated
197  // as a separate instance
198  if (isset($page['MPvar'])) {
199  $collectionPrefix .= '_MP_' . str_replace(',', '', $page['MPvar']);
200  }
201  $pageCollection->addNamePrefix($collectionPrefix . '_');
202  $fullCollection->addCollection($pageCollection);
203  // set default route flag after all routes have been processed
204  $defaultRouteForPage->setOption('_isDefault', true);
205  }
206 
207  $matcher = new PageUriMatcher($fullCollection);
208  try {
209  $result = $matcher->match($prefixedUrlPath);
211  $matchedRoute = $fullCollection->get($result['_route']);
212  return $this->‪buildPageArguments($matchedRoute, $result, $request->getQueryParams());
213  } catch (ResourceNotFoundException $e) {
214  // Second try, look for /my-page even though the request was called via /my-page/ and the slash
215  // was not part of the slug, but let's then check again
216  if (substr($prefixedUrlPath, -1) === '/') {
217  try {
218  $result = $matcher->match(rtrim($prefixedUrlPath, '/'));
220  $matchedRoute = $fullCollection->get($result['_route']);
221  return $this->‪buildPageArguments($matchedRoute, $result, $request->getQueryParams());
222  } catch (ResourceNotFoundException $e) {
223  // Do nothing
224  }
225  }
226  }
227  throw new RouteNotFoundException('No route found for path "' . $urlPath . '"', 1538389998);
228  }
229 
240  public function ‪generateUri($route, array $parameters = [], string $fragment = '', string $type = ''): UriInterface
241  {
242  // Resolve language
243  $language = null;
244  $languageOption = $parameters['_language'] ?? null;
245  unset($parameters['_language']);
246  if ($languageOption instanceof SiteLanguage) {
247  $language = $languageOption;
248  } elseif ($languageOption !== null) {
249  $language = $this->site->getLanguageById((int)$languageOption);
250  }
251  if ($language === null) {
252  $language = $this->site->getDefaultLanguage();
253  }
254 
255  $pageId = 0;
256  if (is_array($route)) {
257  $pageId = (int)$route['uid'];
258  } elseif (is_scalar($route)) {
259  $pageId = (int)$route;
260  }
261 
264  $pageRepository = GeneralUtility::makeInstance(PageRepository::class, ‪$context);
265  $page = $pageRepository->getPage($pageId, true);
266  $pagePath = $page['slug'] ?? '';
267 
268  if ($parameters['MP'] ?? '') {
269  $mountPointPairs = explode(',', $parameters['MP']);
271  $pageId,
272  $pagePath,
273  $mountPointPairs,
274  $pageRepository
275  );
276  // If the MountPoint page has a different site, the link needs to be generated
277  // with the base of the MountPoint page, this is especially relevant for cross-domain linking
278  // Because the language contains the full base, it is retrieved in this case.
279  try {
280  [, $mountPointPage] = explode('-', (string)reset($mountPointPairs));
281  ‪$site = GeneralUtility::makeInstance(SiteMatcher::class)
282  ->matchByPageId((int)$mountPointPage);
283  $language = ‪$site->‪getLanguageById($language->getLanguageId());
284  } catch (SiteNotFoundException $e) {
285  // No alternative site found, use the existing one
286  }
287  // Store the MP parameter in the page record, so it could be used for any enhancers
288  $page['MPvar'] = $parameters['MP'];
289  unset($parameters['MP']);
290  }
291 
292  $originalParameters = $parameters;
293  $collection = new RouteCollection();
294  $defaultRouteForPage = new Route(
295  '/' . ltrim($pagePath, '/'),
296  [],
297  [],
298  ['utf8' => true, '_page' => $page]
299  );
300  $collection->add('default', $defaultRouteForPage);
301 
302  // cHash is never considered because cHash is built by this very method.
303  unset($originalParameters['cHash']);
304  $enhancers = $this->‪getEnhancersForPage($pageId, $language);
305  foreach ($enhancers as $enhancer) {
306  if ($enhancer instanceof RoutingEnhancerInterface) {
307  $enhancer->enhanceForGeneration($collection, $originalParameters);
308  }
309  }
310  foreach ($enhancers as $enhancer) {
311  if ($enhancer instanceof DecoratingEnhancerInterface) {
312  $enhancer->decorateForGeneration($collection, $originalParameters);
313  }
314  }
315 
316  $scheme = $language->getBase()->getScheme();
317  $mappableProcessor = new MappableProcessor();
318  ‪$context = new RequestContext(
319  // page segment (slug & enhanced part) is supposed to start with '/'
320  rtrim($language->getBase()->getPath(), '/'),
321  'GET',
322  $language->getBase()->getHost(),
323  $scheme ?: 'http',
324  $scheme === 'http' ? $language->getBase()->getPort() ?? 80 : 80,
325  $scheme === 'https' ? $language->getBase()->getPort() ?? 443 : 443
326  );
327  $generator = new UrlGenerator($collection, ‪$context);
328  $generator->injectMappableProcessor($mappableProcessor);
329  // set default route flag after all routes have been processed
330  $defaultRouteForPage->setOption('_isDefault', true);
331  $allRoutes = GeneralUtility::makeInstance(RouteSorter::class)
332  ->withRoutes($collection->all())
333  ->withOriginalParameters($originalParameters)
334  ->sortRoutesForGeneration()
335  ->getRoutes();
336  $matchedRoute = null;
337  $pageRouteResult = null;
338  $uri = null;
339  // map our reference type to symfony's custom paths
340  $referenceType = $type === static::ABSOLUTE_PATH ? UrlGenerator::ABSOLUTE_PATH : UrlGenerator::ABSOLUTE_URL;
345  foreach ($allRoutes as $routeName => $route) {
346  try {
347  $parameters = $originalParameters;
348  if ($route->hasOption('deflatedParameters')) {
349  $parameters = $route->getOption('deflatedParameters');
350  }
351  $mappableProcessor->generate($route, $parameters);
352  // ABSOLUTE_URL is used as default fallback
353  $urlAsString = $generator->generate($routeName, $parameters, $referenceType);
354  $uri = new Uri($urlAsString);
356  $matchedRoute = $collection->get($routeName);
357  // fetch potential applied defaults for later cHash generation
358  // (even if not applied in route, it will be exposed during resolving)
359  $appliedDefaults = $matchedRoute->getOption('_appliedDefaults') ?? [];
360  parse_str($uri->getQuery() ?? '', $remainingQueryParameters);
361  $enhancer = $route->getEnhancer();
362  if ($enhancer instanceof InflatableEnhancerInterface) {
363  $remainingQueryParameters = $enhancer->inflateParameters($remainingQueryParameters);
364  }
365  $pageRouteResult = $this->‪buildPageArguments($route, array_merge($appliedDefaults, $parameters), $remainingQueryParameters);
366  break;
367  } catch (MissingMandatoryParametersException $e) {
368  // no match
369  }
370  }
371 
372  if (!$uri instanceof UriInterface) {
373  throw new InvalidRouteArgumentsException('Uri could not be built for page "' . $pageId . '"', 1538390230);
374  }
375 
376  if ($pageRouteResult && $pageRouteResult->areDirty()) {
377  // for generating URLs this should(!) never happen
378  // if it does happen, generator logic has flaws
379  throw new InvalidRouteArgumentsException('Route arguments are dirty', 1537613247);
380  }
381 
382  if ($matchedRoute && $pageRouteResult && !empty($pageRouteResult->getDynamicArguments())) {
383  $cacheHash = $this->‪generateCacheHash($pageId, $pageRouteResult);
384 
385  $queryArguments = $pageRouteResult->getQueryArguments();
386  if (!empty($cacheHash)) {
387  $queryArguments['cHash'] = $cacheHash;
388  }
389  $uri = $uri->withQuery(http_build_query($queryArguments, '', '&', PHP_QUERY_RFC3986));
390  }
391  if ($fragment) {
392  $uri = $uri->withFragment($fragment);
393  }
394  return $uri;
395  }
396 
412  int $pageId,
413  string $pagePath,
414  array $mountPointPairs,
415  PageRepository $pageRepository
416  ): string {
417  // Handle recursive mount points
418  $prefixesToRemove = [];
419  $slugPrefixesToAdd = [];
420  foreach ($mountPointPairs as $mountPointPair) {
421  [$mountRoot, $mountedPage] = ‪GeneralUtility::intExplode('-', $mountPointPair);
422  $mountPageInformation = $pageRepository->getMountPointInfo($mountedPage);
423  if ($mountPageInformation) {
424  if ($pageId === $mountedPage) {
425  continue;
426  }
427  // Get slugs in the translated page
428  $mountedPage = $pageRepository->getPage($mountedPage);
429  $mountRoot = $pageRepository->getPage($mountRoot);
430  $slugPrefix = $mountedPage['slug'] ?? '';
431  if ($slugPrefix === '/') {
432  $slugPrefix = '';
433  }
434  $prefixToRemove = $mountRoot['slug'] ?? '';
435  if ($prefixToRemove === '/') {
436  $prefixToRemove = '';
437  }
438  $prefixesToRemove[] = $prefixToRemove;
439  $slugPrefixesToAdd[] = $slugPrefix;
440  }
441  }
442  $slugPrefixesToAdd = array_reverse($slugPrefixesToAdd);
443  $prefixesToRemove = array_reverse($prefixesToRemove);
444  foreach ($prefixesToRemove as $prefixToRemove) {
445  // Slug prefixes are taken from the beginning of the array, where as the parts to be removed
446  // Are taken from the end.
447  $replacement = array_shift($slugPrefixesToAdd);
448  if ($prefixToRemove !== '' && strpos($pagePath, $prefixToRemove) === 0) {
449  $pagePath = substr($pagePath, strlen($prefixToRemove));
450  }
451  $pagePath = $replacement . ($pagePath !== '/' ? '/' . ltrim($pagePath, '/') : '');
452  }
453  return $pagePath;
454  }
455 
464  protected function ‪getEnhancersForPage(int $pageId, SiteLanguage $language): array
465  {
466  $enhancers = [];
467  foreach ($this->site->getConfiguration()['routeEnhancers'] ?? [] as $enhancerConfiguration) {
468  // Check if there is a restriction to page Ids.
469  if (is_array($enhancerConfiguration['limitToPages'] ?? null) && !in_array($pageId, $enhancerConfiguration['limitToPages'])) {
470  continue;
471  }
472  $enhancerType = $enhancerConfiguration['type'] ?? '';
473  $enhancer = $this->enhancerFactory->create($enhancerType, $enhancerConfiguration);
474  if (!empty($enhancerConfiguration['aspects'] ?? null)) {
475  $aspects = $this->aspectFactory->createAspects(
476  $enhancerConfiguration['aspects'],
477  $language,
478  $this->site
479  );
480  $enhancer->setAspects($aspects);
481  }
482  $enhancers[] = $enhancer;
483  }
484  return $enhancers;
485  }
486 
492  protected function ‪generateCacheHash(int $pageId, PageArguments $arguments): string
493  {
494  return $this->cacheHashCalculator->calculateCacheHash(
495  $this->‪getCacheHashParameters($pageId, $arguments)
496  );
497  }
498 
504  protected function ‪getCacheHashParameters(int $pageId, PageArguments $arguments): array
505  {
506  $hashParameters = $arguments->getDynamicArguments();
507  $hashParameters['id'] = $pageId;
508  $uri = http_build_query($hashParameters, '', '&', PHP_QUERY_RFC3986);
509  return $this->cacheHashCalculator->getRelevantParameters($uri);
510  }
511 
529  protected function ‪buildPageArguments(Route $route, array $results, array $remainingQueryParameters = []): PageArguments
530  {
531  // only use parameters that actually have been processed
532  // (thus stripping internals like _route, _controller, ...)
533  $routeArguments = $this->‪filterProcessedParameters($route, $results);
534  // assert amount of "static" mappers is not too "dynamic"
535  $this->‪assertMaximumStaticMappableAmount($route, array_keys($routeArguments));
536  // delegate result handling to enhancer
537  $enhancer = $route->getEnhancer();
538  if ($enhancer instanceof ResultingInterface) {
539  // forward complete(!) results, not just filtered parameters
540  return $enhancer->buildResult($route, $results, $remainingQueryParameters);
541  }
542  $page = $route->getOption('_page');
543  $pageId = (int)(isset($page['t3ver_oid']) && $page['t3ver_oid'] > 0 ? $page['t3ver_oid'] : $page['uid']);
544  $pageId = (int)($page['l10n_parent'] > 0 ? $page['l10n_parent'] : $pageId);
545  $type = $this->‪resolveType($route, $remainingQueryParameters);
546  // See PageSlugCandidateProvider where this is added.
547  if ($page['MPvar'] ?? '') {
548  $routeArguments['MP'] = $page['MPvar'];
549  }
550  return new PageArguments($pageId, $type, $routeArguments, [], $remainingQueryParameters);
551  }
552 
560  protected function ‪resolveType(Route $route, array &$remainingQueryParameters): string
561  {
562  $type = $remainingQueryParameters['type'] ?? 0;
563  $decoratedParameters = $route->getOption('_decoratedParameters');
564  if (isset($decoratedParameters['type'])) {
565  $type = $decoratedParameters['type'];
566  unset($decoratedParameters['type']);
567  $remainingQueryParameters = array_replace_recursive(
568  $remainingQueryParameters,
569  $decoratedParameters
570  );
571  }
572  return (string)$type;
573  }
574 
584  protected function ‪assertMaximumStaticMappableAmount(Route $route, array $variableNames = [])
585  {
586  // empty when only values of route defaults where used
587  if (empty($variableNames)) {
588  return;
589  }
590  $mappers = $route->filterAspects(
591  [StaticMappableAspectInterface::class, \Countable::class],
592  $variableNames
593  );
594  if (empty($mappers)) {
595  return;
596  }
597 
598  $multipliers = array_map('count', $mappers);
599  $product = array_product($multipliers);
600  if ($product > 10000) {
601  throw new \OverflowException(
602  'Possible range of all mappers is larger than 10000 items',
603  1537696772
604  );
605  }
606  }
607 
615  protected function ‪filterProcessedParameters(Route $route, $results): array
616  {
617  return array_intersect_key(
618  $results,
619  array_flip($route->compile()->getPathVariables())
620  );
621  }
622 
624  {
625  return GeneralUtility::makeInstance(
626  PageSlugCandidateProvider::class,
627  ‪$context,
628  $this->site,
629  $this->enhancerFactory
630  );
631  }
632 }
‪TYPO3\CMS\Core\Routing\PageArguments
Definition: PageArguments.php:26
‪TYPO3\CMS\Core\Routing\Enhancer\EnhancerFactory
Definition: EnhancerFactory.php:26
‪TYPO3\CMS\Core\Context\LanguageAspectFactory
Definition: LanguageAspectFactory.php:27
‪TYPO3\CMS\Core\Routing\RouterInterface
Definition: RouterInterface.php:28
‪TYPO3\CMS\Core\Routing\PageSlugCandidateProvider
Definition: PageSlugCandidateProvider.php:42
‪TYPO3\CMS\Core\Site\Entity\Site\getLanguageById
‪SiteLanguage getLanguageById(int $languageId)
Definition: Site.php:235
‪TYPO3\CMS\Core\Routing\Enhancer\RoutingEnhancerInterface
Definition: RoutingEnhancerInterface.php:26
‪TYPO3\CMS\Core\Routing\RouteResultInterface
Definition: RouteResultInterface.php:24
‪TYPO3\CMS\Core\Routing\PageUriMatcher
Definition: PageUriMatcher.php:33
‪TYPO3\CMS\Core\Routing\RouteCollection
Definition: RouteCollection.php:28
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\getPage
‪array getPage($uid, $disableGroupAccessCheck=false)
Definition: PageRepository.php:248
‪TYPO3\CMS\Core\Exception\SiteNotFoundException
Definition: SiteNotFoundException.php:26
‪TYPO3\CMS\Core\Routing\PageRouter
Definition: PageRouter.php:71
‪TYPO3\CMS\Core\Context\LanguageAspectFactory\createFromSiteLanguage
‪static LanguageAspect createFromSiteLanguage(SiteLanguage $language)
Definition: LanguageAspectFactory.php:34
‪TYPO3\CMS\Core\Routing
‪TYPO3\CMS\Core\Routing\PageRouter\resolveMountPointParameterIntoPageSlug
‪string resolveMountPointParameterIntoPageSlug(int $pageId, string $pagePath, array $mountPointPairs, PageRepository $pageRepository)
Definition: PageRouter.php:406
‪TYPO3\CMS\Core\Routing\RouteNotFoundException
Definition: RouteNotFoundException.php:26
‪TYPO3\CMS\Core\Routing\Enhancer\ResultingInterface
Definition: ResultingInterface.php:28
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\Core\Routing\RouterInterface\generateUri
‪UriInterface generateUri($route, array $parameters=[], string $fragment='', string $type=self::ABSOLUTE_URL)
‪TYPO3\CMS\Core\Http\Uri
Definition: Uri.php:29
‪TYPO3\CMS\Core\Context\Context\setAspect
‪setAspect(string $name, AspectInterface $aspect)
Definition: Context.php:162
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:40
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage
Definition: SiteLanguage.php:26
‪TYPO3\CMS\Core\Routing\PageRouter\getCacheHashParameters
‪array getCacheHashParameters(int $pageId, PageArguments $arguments)
Definition: PageRouter.php:499
‪TYPO3\CMS\Core\Routing\Route\getEnhancer
‪EnhancerInterface null getEnhancer()
Definition: Route.php:69
‪TYPO3\CMS\Core\Routing\PageRouter\$context
‪TYPO3 CMS Core Context Context $context
Definition: PageRouter.php:90
‪TYPO3\CMS\Core\Routing\PageRouter\filterProcessedParameters
‪array filterProcessedParameters(Route $route, $results)
Definition: PageRouter.php:610
‪TYPO3\CMS\Core\Routing\PageRouter\$site
‪Site $site
Definition: PageRouter.php:74
‪TYPO3\CMS\Core\Routing\SiteRouteResult
Definition: SiteRouteResult.php:30
‪TYPO3\CMS\Core\Routing\PageRouter\buildPageArguments
‪PageArguments buildPageArguments(Route $route, array $results, array $remainingQueryParameters=[])
Definition: PageRouter.php:524
‪TYPO3\CMS\Core\Routing\PageRouter\$enhancerFactory
‪EnhancerFactory $enhancerFactory
Definition: PageRouter.php:78
‪TYPO3\CMS\Core\Routing\PageRouter\assertMaximumStaticMappableAmount
‪assertMaximumStaticMappableAmount(Route $route, array $variableNames=[])
Definition: PageRouter.php:579
‪TYPO3\CMS\Core\Routing\PageRouter\getEnhancersForPage
‪EnhancerInterface[] getEnhancersForPage(int $pageId, SiteLanguage $language)
Definition: PageRouter.php:459
‪TYPO3\CMS\Core\Routing\PageRouter\$aspectFactory
‪AspectFactory $aspectFactory
Definition: PageRouter.php:82
‪TYPO3\CMS\Core\Routing\PageRouter\getSlugCandidateProvider
‪getSlugCandidateProvider(Context $context)
Definition: PageRouter.php:618
‪TYPO3\CMS\Core\Routing\Aspect\MappableProcessor
Definition: MappableProcessor.php:26
‪TYPO3\CMS\Core\Routing\PageRouter\$cacheHashCalculator
‪CacheHashCalculator $cacheHashCalculator
Definition: PageRouter.php:86
‪TYPO3\CMS\Core\Routing\PageRouter\__construct
‪__construct(Site $site, Context $context=null)
Definition: PageRouter.php:98
‪TYPO3\CMS\Core\Routing\Route
Definition: Route.php:32
‪TYPO3\CMS\Core\Utility\GeneralUtility\intExplode
‪static int[] intExplode($delimiter, $string, $removeEmptyValues=false, $limit=0)
Definition: GeneralUtility.php:988
‪TYPO3\CMS\Frontend\Page\CacheHashCalculator
Definition: CacheHashCalculator.php:25
‪TYPO3\CMS\Core\Routing\Aspect\StaticMappableAspectInterface
Definition: StaticMappableAspectInterface.php:24
‪TYPO3\CMS\Core\Routing\Aspect\AspectFactory
Definition: AspectFactory.php:33
‪TYPO3\CMS\Core\Routing\Enhancer\InflatableEnhancerInterface
Definition: InflatableEnhancerInterface.php:24
‪TYPO3\CMS\Core\Domain\Repository\PageRepository
Definition: PageRepository.php:52
‪TYPO3\CMS\Core\Routing\PageRouter\resolveType
‪string resolveType(Route $route, array &$remainingQueryParameters)
Definition: PageRouter.php:555
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:46
‪TYPO3\CMS\Core\Routing\PageRouter\generateCacheHash
‪string generateCacheHash(int $pageId, PageArguments $arguments)
Definition: PageRouter.php:487
‪TYPO3\CMS\Core\Routing\Route\filterAspects
‪AspectInterface[] filterAspects(array $classNames, array $variableNames=[])
Definition: Route.php:163
‪TYPO3\CMS\Core\Domain\Repository\PageRepository\getMountPointInfo
‪mixed getMountPointInfo($pageId, $pageRec=false, $prevMountPids=[], $firstPageUid=0)
Definition: PageRepository.php:1082
‪TYPO3\CMS\Core\Http\NormalizedParams
Definition: NormalizedParams.php:35
‪TYPO3\CMS\Core\Routing\PageRouter\matchRequest
‪SiteRouteResult matchRequest(ServerRequestInterface $request, RouteResultInterface $previousResult=null)
Definition: PageRouter.php:115
‪TYPO3\CMS\Core\Routing\Enhancer\DecoratingEnhancerInterface
Definition: DecoratingEnhancerInterface.php:26
‪TYPO3\CMS\Core\Routing\Enhancer\EnhancerInterface
Definition: EnhancerInterface.php:27