mirror of
https://github.com/werkraum-media/thuecat.git
synced 2024-12-04 19:16:13 +01:00
Use decorator pattern for RequestFactory (#54)
The implementation of the TYPO3 RequestFactory and Uri classes is internal API. It is therefore better to decorate the PSR-17 interfaces instead of extending or using the TYPO3 implementation directly.
This commit is contained in:
parent
2e4c9cc04e
commit
9bdb998f6d
2 changed files with 48 additions and 10 deletions
|
@ -23,28 +23,48 @@ declare(strict_types=1);
|
|||
|
||||
namespace WerkraumMedia\ThueCat\Domain\Import;
|
||||
|
||||
use Psr\Http\Message\RequestFactoryInterface;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\UriFactoryInterface;
|
||||
use Psr\Http\Message\UriInterface;
|
||||
use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException;
|
||||
use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
|
||||
use TYPO3\CMS\Core\Http\RequestFactory as Typo3RequestFactory;
|
||||
use TYPO3\CMS\Core\Http\Uri;
|
||||
|
||||
class RequestFactory extends Typo3RequestFactory
|
||||
class RequestFactory implements RequestFactoryInterface
|
||||
{
|
||||
/**
|
||||
* @var ExtensionConfiguration
|
||||
*/
|
||||
private $extensionConfiguration;
|
||||
|
||||
/**
|
||||
* @var RequestFactoryInterface
|
||||
*/
|
||||
private $requestFactory;
|
||||
|
||||
/**
|
||||
* @var UriFactoryInterface
|
||||
*/
|
||||
private $uriFactory;
|
||||
|
||||
public function __construct(
|
||||
ExtensionConfiguration $extensionConfiguration
|
||||
ExtensionConfiguration $extensionConfiguration,
|
||||
RequestFactoryInterface $requestFactory,
|
||||
UriFactoryInterface $uriFactory
|
||||
) {
|
||||
$this->extensionConfiguration = $extensionConfiguration;
|
||||
$this->requestFactory = $requestFactory;
|
||||
$this->uriFactory = $uriFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param UriInterface|string $uri The URI associated with the request.
|
||||
*/
|
||||
public function createRequest(string $method, $uri): RequestInterface
|
||||
{
|
||||
$uri = new Uri((string) $uri);
|
||||
if (!$uri instanceof UriInterface) {
|
||||
$uri = $this->uriFactory->createUri((string) $uri);
|
||||
}
|
||||
|
||||
$query = [];
|
||||
parse_str($uri->getQuery(), $query);
|
||||
|
@ -60,6 +80,6 @@ class RequestFactory extends Typo3RequestFactory
|
|||
|
||||
$uri = $uri->withQuery(http_build_query($query));
|
||||
|
||||
return parent::createRequest($method, $uri);
|
||||
return $this->requestFactory->createRequest($method, $uri);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,8 @@ namespace WerkraumMedia\ThueCat\Tests\Unit\Domain\Import;
|
|||
use PHPUnit\Framework\TestCase;
|
||||
use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException;
|
||||
use TYPO3\CMS\Core\Configuration\ExtensionConfiguration;
|
||||
use TYPO3\CMS\Core\Http\RequestFactory as Typo3RequestFactory;
|
||||
use TYPO3\CMS\Core\Http\UriFactory;
|
||||
use WerkraumMedia\ThueCat\Domain\Import\RequestFactory;
|
||||
|
||||
/**
|
||||
|
@ -39,9 +41,13 @@ class RequestFactoryTest extends TestCase
|
|||
public function canBeCreated(): void
|
||||
{
|
||||
$extensionConfiguration = $this->createStub(ExtensionConfiguration::class);
|
||||
$requestFactory = new Typo3RequestFactory();
|
||||
$uriFactory = new UriFactory();
|
||||
|
||||
$subject = new RequestFactory(
|
||||
$extensionConfiguration
|
||||
$extensionConfiguration,
|
||||
$requestFactory,
|
||||
$uriFactory
|
||||
);
|
||||
|
||||
self::assertInstanceOf(RequestFactory::class, $subject);
|
||||
|
@ -53,9 +59,13 @@ class RequestFactoryTest extends TestCase
|
|||
public function returnsRequestWithJsonIdFormat(): void
|
||||
{
|
||||
$extensionConfiguration = $this->createStub(ExtensionConfiguration::class);
|
||||
$requestFactory = new Typo3RequestFactory();
|
||||
$uriFactory = new UriFactory();
|
||||
|
||||
$subject = new RequestFactory(
|
||||
$extensionConfiguration
|
||||
$extensionConfiguration,
|
||||
$requestFactory,
|
||||
$uriFactory
|
||||
);
|
||||
|
||||
$request = $subject->createRequest('GET', 'https://example.com/api/ext-sync/get-updated-nodes?syncScopeId=dd3738dc-58a6-4748-a6ce-4950293a06db');
|
||||
|
@ -70,9 +80,13 @@ class RequestFactoryTest extends TestCase
|
|||
{
|
||||
$extensionConfiguration = $this->createStub(ExtensionConfiguration::class);
|
||||
$extensionConfiguration->method('get')->willReturn('some-api-key');
|
||||
$requestFactory = new Typo3RequestFactory();
|
||||
$uriFactory = new UriFactory();
|
||||
|
||||
$subject = new RequestFactory(
|
||||
$extensionConfiguration
|
||||
$extensionConfiguration,
|
||||
$requestFactory,
|
||||
$uriFactory
|
||||
);
|
||||
|
||||
$request = $subject->createRequest('GET', 'https://example.com/api/ext-sync/get-updated-nodes?syncScopeId=dd3738dc-58a6-4748-a6ce-4950293a06db');
|
||||
|
@ -87,9 +101,13 @@ class RequestFactoryTest extends TestCase
|
|||
{
|
||||
$extensionConfiguration = $this->createStub(ExtensionConfiguration::class);
|
||||
$extensionConfiguration->method('get')->willThrowException(new ExtensionConfigurationExtensionNotConfiguredException());
|
||||
$requestFactory = new Typo3RequestFactory();
|
||||
$uriFactory = new UriFactory();
|
||||
|
||||
$subject = new RequestFactory(
|
||||
$extensionConfiguration
|
||||
$extensionConfiguration,
|
||||
$requestFactory,
|
||||
$uriFactory
|
||||
);
|
||||
|
||||
$request = $subject->createRequest('GET', 'https://example.com/api/ext-sync/get-updated-nodes?syncScopeId=dd3738dc-58a6-4748-a6ce-4950293a06db');
|
||||
|
|
Loading…
Reference in a new issue