-
-
Notifications
You must be signed in to change notification settings - Fork 255
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[!!!][TASK] Remove UriStrategy logic and move to PSR-14 event
The UriStrategy concept was needed to generate Frontend URLs in order to index a frontend page. This concept was used in TYPO3 v9 to support site-based routing and non-site-based projects. This has now been removed as TYPO3 Core v11+ does only support site-based frontend page resolving. For this reason, the "UriStrategyFactory" and all the handling has been removed, and the "TYPO3SiteStrategy" has been renamed to "PageUriBuilder". The hook logic to modify the indexing URL `$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['solr']['IndexQueuePageIndexer']['dataUrlModifier']` and the according interface "PageIndexerDataUrlModifier" has been removed and replaced by a new PSR-14 event: `ApacheSolrForTypo3\Solr\Event\Indexing\AfterFrontendPageUriForIndexingHasBeenGeneratedEvent". Usages of UriHelper have been reduced in favor of PSR-7 UriInterface. IntegrationTests for the new Event have been added.
- Loading branch information
Showing
11 changed files
with
334 additions
and
279 deletions.
There are no files selected for viewing
133 changes: 0 additions & 133 deletions
133
Classes/Domain/Index/PageIndexer/Helper/UriBuilder/AbstractUriStrategy.php
This file was deleted.
Oops, something went wrong.
67 changes: 0 additions & 67 deletions
67
Classes/Domain/Index/PageIndexer/Helper/UriBuilder/TYPO3SiteStrategy.php
This file was deleted.
Oops, something went wrong.
50 changes: 0 additions & 50 deletions
50
Classes/Domain/Index/PageIndexer/Helper/UriStrategyFactory.php
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
/* | ||
* This file is part of the TYPO3 CMS project. | ||
* | ||
* It is free software; you can redistribute it and/or modify it under | ||
* the terms of the GNU General Public License, either version 2 | ||
* of the License, or any later version. | ||
* | ||
* For the full copyright and license information, please read the | ||
* LICENSE.txt file that was distributed with this source code. | ||
* | ||
* The TYPO3 project - inspiring people to share! | ||
*/ | ||
|
||
namespace ApacheSolrForTypo3\Solr\Domain\Index\PageIndexer; | ||
|
||
use ApacheSolrForTypo3\Solr\Event\Indexing\AfterFrontendPageUriForIndexingHasBeenGeneratedEvent; | ||
use ApacheSolrForTypo3\Solr\IndexQueue\Item; | ||
use ApacheSolrForTypo3\Solr\System\Logging\SolrLogManager; | ||
use Psr\EventDispatcher\EventDispatcherInterface; | ||
use Psr\Http\Message\UriInterface; | ||
use TYPO3\CMS\Core\Exception\SiteNotFoundException; | ||
use TYPO3\CMS\Core\Site\SiteFinder; | ||
use TYPO3\CMS\Core\Utility\GeneralUtility; | ||
|
||
/** | ||
* This class is used to build the indexing url for a TYPO3 frontend. | ||
* These sites have the pageId and language information encoded in the speaking url. | ||
* | ||
* EXT:solr will then extend the URL with additional header information to actually | ||
* trigger a frontend request to index a page. | ||
*/ | ||
class PageUriBuilder | ||
{ | ||
protected SiteFinder $siteFinder; | ||
protected SolrLogManager $logger; | ||
protected EventDispatcherInterface $eventDispatcher; | ||
|
||
public function __construct( | ||
SolrLogManager $logger = null, | ||
SiteFinder $siteFinder = null, | ||
EventDispatcherInterface $eventDispatcher = null | ||
) { | ||
$this->logger = $logger ?? GeneralUtility::makeInstance(SolrLogManager::class, __CLASS__); | ||
$this->siteFinder = $siteFinder ?? GeneralUtility::makeInstance(SiteFinder::class); | ||
$this->eventDispatcher = $eventDispatcher ?? GeneralUtility::makeInstance(EventDispatcherInterface::class); | ||
} | ||
|
||
/** | ||
* Builds and returns URI for page indexing from index queue item | ||
* Handles "pages" type only. | ||
* | ||
* @throws SiteNotFoundException | ||
*/ | ||
protected function buildPageIndexingUriFromPageItemAndLanguageId( | ||
Item $item, | ||
int $language = 0, | ||
string $mountPointParameter = '', | ||
): UriInterface { | ||
$site = $this->siteFinder->getSiteByPageId($item->getRecordUid()); | ||
$parameters = []; | ||
|
||
if ($language > 0) { | ||
$parameters['_language'] = $language; | ||
} | ||
|
||
if ($mountPointParameter !== '') { | ||
$parameters['MP'] = $mountPointParameter; | ||
} | ||
|
||
return $site->getRouter()->generateUri($item->getRecord(), $parameters); | ||
} | ||
|
||
protected function applyTypoScriptOverridesOnIndexingUrl(UriInterface $urlHelper, array $overrideConfiguration): UriInterface | ||
{ | ||
// check whether we should use ssl / https | ||
if (!empty($overrideConfiguration['scheme'])) { | ||
$urlHelper = $urlHelper->withScheme($overrideConfiguration['scheme']); | ||
} | ||
|
||
// overwriting the host | ||
if (!empty($overrideConfiguration['host'])) { | ||
$urlHelper = $urlHelper->withHost($overrideConfiguration['host']); | ||
} | ||
|
||
// overwriting the port | ||
if (!empty($overrideConfiguration['port'])) { | ||
$urlHelper = $urlHelper->withPort((int)$overrideConfiguration['port']); | ||
} | ||
|
||
// setting a path if TYPO3 is installed in a subdirectory | ||
if (!empty($overrideConfiguration['path'])) { | ||
$urlHelper = $urlHelper->withPath($overrideConfiguration['path']); | ||
} | ||
|
||
return $urlHelper; | ||
} | ||
|
||
public function getPageIndexingUriFromPageItemAndLanguageId( | ||
Item $item, | ||
int $language = 0, | ||
string $mountPointParameter = '', | ||
array $options = [] | ||
): string { | ||
$pageIndexUri = $this->buildPageIndexingUriFromPageItemAndLanguageId($item, $language, $mountPointParameter); | ||
$overrideConfiguration = $options['frontendDataHelper.'] ?? []; | ||
$pageIndexUri = $this->applyTypoScriptOverridesOnIndexingUrl($pageIndexUri, $overrideConfiguration); | ||
|
||
if (!GeneralUtility::isValidUrl((string)$pageIndexUri)) { | ||
$this->logger->log( | ||
SolrLogManager::ERROR, | ||
'Could not create a valid URL to get frontend data while trying to index a page.', | ||
[ | ||
'item' => (array)$item, | ||
'constructed URL' => (string)$pageIndexUri, | ||
'scheme' => $pageIndexUri->getScheme(), | ||
'host' => $pageIndexUri->getHost(), | ||
'path' => $pageIndexUri->getPath(), | ||
'page ID' => $item->getRecordUid(), | ||
'indexer options' => $options, | ||
] | ||
); | ||
|
||
throw new \RuntimeException( | ||
'Could not create a valid URL to get frontend data while trying to index a page. Created URL: ' . (string)$pageIndexUri, | ||
1311080805 | ||
); | ||
} | ||
|
||
$event = new AfterFrontendPageUriForIndexingHasBeenGeneratedEvent($item, $pageIndexUri, $language, $mountPointParameter, $options); | ||
$event = $this->eventDispatcher->dispatch($event); | ||
return (string)$event->getPageIndexUri(); | ||
} | ||
} |
Oops, something went wrong.