Skip to content

Commit c783cfa

Browse files
committed
[TASK] Refactor dispatcher and middleware
Move rendering related code from dispatcher to content object and change middleware to configure TSFE to call our content object during rendering. Remove obsolete classes and files, as we now correctly interface with the middleware stack and TYPO3 frontend rendering.
1 parent 49428c6 commit c783cfa

File tree

9 files changed

+166
-358
lines changed

9 files changed

+166
-358
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
namespace Helhum\TyposcriptRendering\ContentObject;
3+
4+
/*
5+
* This file is part of the TypoScript Rendering TYPO3 extension.
6+
*
7+
* It is free software; you can redistribute it and/or modify it under
8+
* the terms of the GNU General Public License, either version 2
9+
* of the License, or any later version.
10+
*
11+
* For the full copyright and license information, please read
12+
* LICENSE file that was distributed with this source code.
13+
*
14+
*/
15+
16+
use Helhum\TyposcriptRendering\Exception;
17+
use Helhum\TyposcriptRendering\Mvc\Request;
18+
use Helhum\TyposcriptRendering\Mvc\RequestBuilder;
19+
use Helhum\TyposcriptRendering\Mvc\Response;
20+
use Helhum\TyposcriptRendering\Renderer\RenderingContext;
21+
use Helhum\TyposcriptRendering\Renderer\RenderingInterface;
22+
use TYPO3\CMS\Frontend\ContentObject\AbstractContentObject;
23+
use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
24+
25+
class TypoScriptRenderingContentObject extends AbstractContentObject
26+
{
27+
/**
28+
* @var RequestBuilder
29+
*/
30+
private $requestBuilder;
31+
32+
/**
33+
* @var string[]
34+
*/
35+
private $renderer;
36+
37+
/**
38+
* @param RequestBuilder $requestBuilder
39+
* @param string[] $renderer
40+
*/
41+
public function __construct(ContentObjectRenderer $cObj, RequestBuilder $requestBuilder = null, array $renderer = null)
42+
{
43+
parent::__construct($cObj);
44+
$this->requestBuilder = $requestBuilder ?: new RequestBuilder();
45+
$this->renderer = $renderer ?: $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['typoscript_rendering']['renderClasses'];
46+
}
47+
48+
public function render($conf = []): string
49+
{
50+
$renderingRequest = $this->requestBuilder->build($conf['request']);
51+
$response = new Response();
52+
53+
$renderer = $this->resolveRenderer($renderingRequest);
54+
$renderingContext = new RenderingContext($GLOBALS['TSFE']);
55+
$renderer->renderRequest($renderingRequest, $response, $renderingContext);
56+
57+
return $response->getContent();
58+
}
59+
60+
/**
61+
* @param Request $request
62+
*
63+
* @throws Exception
64+
* @return RenderingInterface
65+
*
66+
*/
67+
protected function resolveRenderer(Request $request)
68+
{
69+
if ($request->hasArgument('renderer') && isset($this->renderer[$request->getArgument('renderer')])) {
70+
$rendererClassName = $this->renderer[$request->getArgument('renderer')];
71+
/** @var RenderingInterface $renderer */
72+
$renderer = new $rendererClassName();
73+
if ($renderer->canRender($request)) {
74+
return $renderer;
75+
}
76+
}
77+
78+
foreach ($this->renderer as $rendererClassName) {
79+
/** @var RenderingInterface $renderer */
80+
$renderer = new $rendererClassName();
81+
if ($renderer->canRender($request)) {
82+
return $renderer;
83+
}
84+
}
85+
86+
throw new Exception('No renderer found for this request!', 1403628294);
87+
}
88+
}

Classes/Core/FrontendRenderingProvisioner.php

Lines changed: 0 additions & 167 deletions
This file was deleted.

Classes/Middleware/TypoScriptRenderingHandler.php

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
namespace Helhum\TyposcriptRendering\Middleware;
3+
4+
/*
5+
* This file is part of the TypoScript Rendering TYPO3 extension.
6+
*
7+
* It is free software; you can redistribute it and/or modify it under
8+
* the terms of the GNU General Public License, either version 2
9+
* of the License, or any later version.
10+
*
11+
* For the full copyright and license information, please read
12+
* LICENSE file that was distributed with this source code.
13+
*
14+
*/
15+
16+
use Psr\Http\Message\ResponseInterface;
17+
use Psr\Http\Message\ServerRequestInterface;
18+
use Psr\Http\Server\MiddlewareInterface;
19+
use Psr\Http\Server\RequestHandlerInterface;
20+
use TYPO3\CMS\Core\Exception;
21+
22+
/**
23+
* Lightweight alternative to regular frontend requests based on typoscript_rendering extensions; used when $_GET[tx_typoscriptrendering] is set.
24+
*/
25+
class TypoScriptRenderingMiddleware implements MiddlewareInterface
26+
{
27+
private const argumentNamespace = 'tx_typoscriptrendering';
28+
29+
/**
30+
* Dispatches the request to the corresponding typoscript_rendering configuration
31+
*
32+
* @param ServerRequestInterface $request
33+
* @param RequestHandlerInterface $handler
34+
* @throws Exception
35+
* @return ResponseInterface
36+
*/
37+
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
38+
{
39+
$frontendController = $GLOBALS['TSFE'];
40+
if (!$frontendController->isGeneratePage() || !isset($request->getQueryParams()[self::argumentNamespace])) {
41+
return $handler->handle($request);
42+
}
43+
$this->ensureRequiredEnvironment();
44+
45+
$frontendController->config['config']['disableAllHeaderCode'] = 1;
46+
$frontendController->pSetup = [
47+
'10' => 'TYPOSCRIPT_RENDERING',
48+
'10.' => [
49+
'request' => $request->getQueryParams()[self::argumentNamespace],
50+
],
51+
];
52+
53+
return $handler->handle($request);
54+
}
55+
56+
/**
57+
* @throws Exception
58+
* @return void
59+
*
60+
*/
61+
private function ensureRequiredEnvironment()
62+
{
63+
if (empty($GLOBALS['TYPO3_CONF_VARS']['FE']['pageNotFoundOnCHashError'])) {
64+
throw new Exception('$GLOBALS[\'TYPO3_CONF_VARS\'][\'FE\'][\'pageNotFoundOnCHashError\'] needs to be enabled when using out of bound typoscript rendering!', 1403808246);
65+
}
66+
if (empty($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['typoscript_rendering']['renderClasses']) || !is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['typoscript_rendering']['renderClasses'])) {
67+
throw new Exception('No renderer found in configuration: $GLOBALS[\'TYPO3_CONF_VARS\'][\'EXTCONF\'][\'typoscript_rendering\'][\'renderClasses\']', 1403808247);
68+
}
69+
if (!in_array('tx_typoscriptrendering[context]', $GLOBALS['TYPO3_CONF_VARS']['FE']['cacheHash']['requireCacheHashPresenceParameters'], true)) {
70+
throw new Exception('tx_typoscriptrendering[context] must be set as required cHash parameter', 1403808248);
71+
}
72+
}
73+
}

Classes/Mvc/RequestBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class RequestBuilder
2525
* @return Request
2626
*
2727
*/
28-
public function build($rawRequestArgument)
28+
public function build($rawRequestArgument): Request
2929
{
3030
if (empty($rawRequestArgument['context']) || !is_string($rawRequestArgument['context'])) {
3131
throw new Exception('tx_typoscriptrendering|context must not be empty and must be of type string!', 1403793452);

0 commit comments

Comments
 (0)