Skip to content

Commit c36be25

Browse files
committed
Move changing language request set in header X-Locale to earlier stage, before "typo3/cms-frontend/tsfe". Add support for setting language of api request by standard language prefix instead of header X-Locale.
1 parent 1bf367c commit c36be25

6 files changed

Lines changed: 96 additions & 14 deletions

File tree

Classes/Hook/EnrichHashBase.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44

55
namespace SourceBroker\T3api\Hook;
66

7-
use SourceBroker\T3api\Routing\Enhancer\ResourceEnhancer;
8-
use TYPO3\CMS\Core\Http\ServerRequest;
7+
use SourceBroker\T3api\Service\RouteService;
98

109
class EnrichHashBase
1110
{
@@ -17,13 +16,7 @@ class EnrichHashBase
1716
*/
1817
public function init(array &$params): void
1918
{
20-
/** @var ServerRequest $request */
21-
$request = $GLOBALS['TYPO3_REQUEST'] ?? null;
22-
if (
23-
$request instanceof ServerRequest
24-
&& is_array($request->getQueryParams())
25-
&& array_key_exists(ResourceEnhancer::PARAMETER_NAME, $request->getQueryParams())
26-
) {
19+
if (RouteService::routeHasT3ApiResourceEnhancerQueryParam()) {
2720
$params['hashParameters']['t3api_hash_base_random'] = microtime();
2821
}
2922
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
namespace SourceBroker\T3api\Middleware;
4+
5+
use Psr\Http\Message\ResponseInterface;
6+
use Psr\Http\Message\ServerRequestInterface;
7+
use Psr\Http\Server\MiddlewareInterface;
8+
use Psr\Http\Server\RequestHandlerInterface;
9+
use SourceBroker\T3api\Service\RouteService;
10+
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
11+
12+
class T3apiRequestLanguageResolver implements MiddlewareInterface
13+
{
14+
/**
15+
* Prepare Language switch for t3api
16+
*
17+
* @param ServerRequestInterface $request
18+
* @param RequestHandlerInterface $handler
19+
* @return ResponseInterface
20+
*/
21+
public function process(
22+
ServerRequestInterface $request,
23+
RequestHandlerInterface $handler
24+
): ResponseInterface {
25+
26+
/** @var SiteLanguage $language */
27+
$language = $request->getAttribute('language');
28+
$t3apiHeaderLanguageUid = $this->getT3apiLanguageUid($request);
29+
30+
if ($t3apiHeaderLanguageUid !== null
31+
&& RouteService::routeHasT3ApiResourceEnhancerQueryParam($request)
32+
&& ($language && $language->getLanguageId() !== $t3apiHeaderLanguageUid)
33+
) {
34+
$request->withAttribute('t3apiHeaderLanguageRequest', true);
35+
$request = $request->withAttribute(
36+
'language',
37+
$request->getAttribute('site')->getLanguageById($t3apiHeaderLanguageUid)
38+
);
39+
}
40+
return $handler->handle($request);
41+
}
42+
43+
protected function getT3apiLanguageUid(ServerRequestInterface $request): ?int
44+
{
45+
$languageHeader = $request->getHeader($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['t3api']['languageHeader']);
46+
return (!empty($languageHeader) ? (int)array_shift($languageHeader) : null);
47+
}
48+
}

Classes/Middleware/T3apiRequestResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Psr\Http\Server\RequestHandlerInterface;
1111
use SourceBroker\T3api\Dispatcher\Bootstrap;
1212
use SourceBroker\T3api\Routing\Enhancer\ResourceEnhancer;
13+
use SourceBroker\T3api\Service\RouteService;
1314
use Throwable;
1415

1516
/**
@@ -29,8 +30,7 @@ public function __construct(Bootstrap $bootstrap)
2930
*/
3031
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
3132
{
32-
if (is_array($request->getQueryParams())
33-
&& array_key_exists(ResourceEnhancer::PARAMETER_NAME, $request->getQueryParams())) {
33+
if (RouteService::routeHasT3ApiResourceEnhancerQueryParam($request)) {
3434
return $this->bootstrap->process($this->cleanupRequest($request));
3535
}
3636

Classes/Service/RouteService.php

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44

55
namespace SourceBroker\T3api\Service;
66

7+
use Psr\Http\Message\ServerRequestInterface;
78
use RuntimeException;
89
use SourceBroker\T3api\Routing\Enhancer\ResourceEnhancer;
10+
use TYPO3\CMS\Core\Http\ServerRequest;
911
use TYPO3\CMS\Core\SingletonInterface;
12+
use TYPO3\CMS\Core\Site\Entity\SiteLanguage;
1013

1114
class RouteService implements SingletonInterface
1215
{
@@ -24,7 +27,7 @@ public static function getApiBasePath(): string
2427
*/
2528
public static function getFullApiBasePath(): string
2629
{
27-
return trim(self::getDefaultLanguageBasePath() . self::getApiBasePath(), '/');
30+
return trim(self::getLanguageBasePath() . self::getApiBasePath(), '/');
2831
}
2932

3033
public static function getFullApiBaseUrl(): string
@@ -33,6 +36,13 @@ public static function getFullApiBaseUrl(): string
3336
. '/' . ltrim(self::getFullApiBasePath(), '/');
3437
}
3538

39+
public static function routeHasT3ApiResourceEnhancerQueryParam(ServerRequestInterface $request = null): bool
40+
{
41+
$request = $request ?? self::getRequest();
42+
return $request instanceof ServerRequest && is_array($request->getQueryParams())
43+
&& array_key_exists(ResourceEnhancer::PARAMETER_NAME, $request->getQueryParams());
44+
}
45+
3646
protected static function getApiRouteEnhancer(): array
3747
{
3848
static $apiRouteEnhancer;
@@ -57,8 +67,29 @@ protected static function getApiRouteEnhancer(): array
5767
);
5868
}
5969

60-
protected static function getDefaultLanguageBasePath(): string
70+
/**
71+
* We support for two cases:language set in X-Locale header
72+
* 1) when request has X-Locale header with language (t3apiHeaderLanguageRequest))
73+
* 2) when request has no X-Locale header and url itself stores language information
74+
*/
75+
protected static function getLanguageBasePath(): string
76+
{
77+
$request = self::getRequest();
78+
/** @var SiteLanguage $requestLanguage */
79+
$requestLanguage = $request->getAttribute('language');
80+
$languagePrefix = $requestLanguage && $request->getAttribute('t3apiHeaderLanguageRequest') !== true ?
81+
$requestLanguage->getBase()->getPath() :
82+
SiteService::getCurrent()->getDefaultLanguage()->getBase()->getPath();
83+
84+
if (str_starts_with((string)$request?->getUri()->getPath(), $languagePrefix)) {
85+
return $languagePrefix;
86+
}
87+
88+
return '';
89+
}
90+
91+
protected static function getRequest(): ServerRequestInterface
6192
{
62-
return SiteService::getCurrent()->getDefaultLanguage()->getBase()->getPath();
93+
return $GLOBALS['TYPO3_REQUEST'];
6394
}
6495
}

Configuration/RequestMiddlewares.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44

55
return [
66
'frontend' => [
7+
'sourcebroker/t3api/prepare-api-request' => [
8+
'target' => \SourceBroker\T3api\Middleware\T3apiRequestLanguageResolver::class,
9+
'after' => [
10+
'typo3/cms-frontend/site'
11+
],
12+
'before' => [
13+
'typo3/cms-frontend/tsfe'
14+
]
15+
],
716
'sourcebroker/t3api/process-api-request' => [
817
'target' => \SourceBroker\T3api\Middleware\T3apiRequestResolver::class,
918
'after' => [

Documentation/Miscellaneous/Changelog/Index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Changelog
1212
- Protect against "&cHash empty" error when ``cacheHash.enforceValidation`` is set to ``true`` [`issue <https://github.com/sourcebroker/t3api/issues/81>`__]
1313
- Add testing instance for TYPO3 12, remove testing instance for TYPO3 10. Change PHP to 8.1 for testing instances.
1414
- [!!!] Drop TYPO3 10, TYPO3 11 on dependencies. Update dependencies to TYPO3 12.
15+
- Move changing language request set in header X-Locale to earlier stage, before "typo3/cms-frontend/tsfe". Add support for setting language of api request by standard language prefix instead of header X-Locale.
1516

1617
2.0.3
1718
=====

0 commit comments

Comments
 (0)