From 7fb5a89fb064debe19ba88bba9a5050be8b61fca Mon Sep 17 00:00:00 2001 From: Adrien Roches Date: Mon, 3 Jun 2024 23:48:38 +0200 Subject: [PATCH 1/2] [FEATURE] Add logs --- composer.json | 16 +++++++++------- config/builder_pdf.php | 8 ++++++++ config/builder_screenshot.php | 7 +++++++ src/Builder/Pdf/AbstractPdfBuilder.php | 15 +++++++++++++++ .../Screenshot/AbstractScreenshotBuilder.php | 12 ++++++++++++ src/Client/GotenbergClient.php | 4 ++-- src/DependencyInjection/Configuration.php | 2 +- tests/Client/GotenbergClientTest.php | 2 +- .../SensiolabsGotenbergExtensionTest.php | 2 +- 9 files changed, 56 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 6a6c8db..568d2a2 100644 --- a/composer.json +++ b/composer.json @@ -23,21 +23,22 @@ "php": ">=8.2", "symfony/config": "^6.4 || ^7.0", "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/filesystem": "^6.4 || ^7.0", + "symfony/http-client": "^6.4 || ^7.0", "symfony/http-kernel": "^6.4 || ^7.0", "symfony/mime": "^6.4 || ^7.0", - "symfony/string": "^6.4 || ^7.0", - "symfony/http-client": "^6.4 || ^7.0", - "symfony/filesystem": "^6.4 || ^7.0" + "symfony/string": "^6.4 || ^7.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.41", - "phpstan/phpstan": "^1.10", + "monolog/monolog": "^3.6", "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", "phpstan/phpstan-symfony": "^1.3", "phpunit/phpunit": "^10.4", "symfony/framework-bundle": "^6.4 || ^7.0", - "symfony/twig-bundle": "^6.4 || ^7.0", - "symfony/stopwatch": "^6.4 || ^7.0" + "symfony/stopwatch": "^6.4 || ^7.0", + "symfony/twig-bundle": "^6.4 || ^7.0" }, "config": { "allow-plugins": { @@ -46,6 +47,7 @@ "sort-packages": true }, "suggest": { - "symfony/twig-bundle": "Allows you to use Twig to render templates into PDF" + "symfony/twig-bundle": "Allows you to use Twig to render templates into PDF", + "monolog/monolog": "Enables logging througout the generating process." } } diff --git a/config/builder_pdf.php b/config/builder_pdf.php index 4e7287a..e3bbdb7 100644 --- a/config/builder_pdf.php +++ b/config/builder_pdf.php @@ -10,6 +10,10 @@ return static function (ContainerConfigurator $container): void { $services = $container->services(); + $services->defaults() + ->tag('monolog.logger', ['channel' => 'sensiolabs_gotenberg']) + ; + $services->set('.sensiolabs_gotenberg.pdf_builder.html', HtmlPdfBuilder::class) ->share(false) ->args([ @@ -17,6 +21,7 @@ service('sensiolabs_gotenberg.asset.base_dir_formatter'), service('twig')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.pdf_builder') ; @@ -28,6 +33,7 @@ service('twig')->nullOnInvalid(), service('router')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.pdf_builder') ; @@ -38,6 +44,7 @@ service('sensiolabs_gotenberg.asset.base_dir_formatter'), service('twig')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.pdf_builder') ; @@ -47,6 +54,7 @@ service('sensiolabs_gotenberg.client'), service('sensiolabs_gotenberg.asset.base_dir_formatter'), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.pdf_builder') ; }; diff --git a/config/builder_screenshot.php b/config/builder_screenshot.php index b8b1b0f..693711f 100644 --- a/config/builder_screenshot.php +++ b/config/builder_screenshot.php @@ -9,6 +9,10 @@ return static function (ContainerConfigurator $container): void { $services = $container->services(); + $services->defaults() + ->tag('monolog.logger', ['channel' => 'sensiolabs_gotenberg']) + ; + $services->set('.sensiolabs_gotenberg.screenshot_builder.html', HtmlScreenshotBuilder::class) ->share(false) ->args([ @@ -16,6 +20,7 @@ service('sensiolabs_gotenberg.asset.base_dir_formatter'), service('twig')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.screenshot_builder') ; @@ -27,6 +32,7 @@ service('twig')->nullOnInvalid(), service('router')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.screenshot_builder') ; @@ -37,6 +43,7 @@ service('sensiolabs_gotenberg.asset.base_dir_formatter'), service('twig')->nullOnInvalid(), ]) + ->call('setLogger', [service('logger')->nullOnInvalid()]) ->tag('sensiolabs_gotenberg.screenshot_builder') ; }; diff --git a/src/Builder/Pdf/AbstractPdfBuilder.php b/src/Builder/Pdf/AbstractPdfBuilder.php index ca51c35..67beb08 100644 --- a/src/Builder/Pdf/AbstractPdfBuilder.php +++ b/src/Builder/Pdf/AbstractPdfBuilder.php @@ -2,6 +2,7 @@ namespace Sensiolabs\GotenbergBundle\Builder\Pdf; +use Psr\Log\LoggerInterface; use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Client\GotenbergResponse; use Sensiolabs\GotenbergBundle\Enum\Part; @@ -13,6 +14,8 @@ abstract class AbstractPdfBuilder implements PdfBuilderInterface { + protected LoggerInterface|null $logger = null; + /** * @var array */ @@ -59,6 +62,11 @@ public function __construct( ]; } + public function setLogger(LoggerInterface|null $logger): void + { + $this->logger = $logger; + } + /** * @return array */ @@ -96,6 +104,10 @@ public function fileName(string $fileName, string $headerDisposition = HeaderUti public function generate(): GotenbergResponse { + $this->logger?->debug('Generating PDF file using {sensiolabs_gotenberg.builder} builder.', [ + 'sensiolabs_gotenberg.builder' => $this::class, + ]); + $pdfResponse = $this->gotenbergClient->call($this->getEndpoint(), $this->getMultipartFormData()); if (null !== $this->fileName) { @@ -125,6 +137,9 @@ public function getMultipartFormData(): array $preCallback = null; if (\array_key_exists($key, $this->normalizers)) { + $this->logger?->debug('Normalizer found for key {sensiolabs_gotenberg.key}.', [ + 'sensiolabs_gotenberg.key' => $key, + ]); $preCallback = $this->normalizers[$key](...); } diff --git a/src/Builder/Screenshot/AbstractScreenshotBuilder.php b/src/Builder/Screenshot/AbstractScreenshotBuilder.php index 0f52899..0ef3b13 100644 --- a/src/Builder/Screenshot/AbstractScreenshotBuilder.php +++ b/src/Builder/Screenshot/AbstractScreenshotBuilder.php @@ -2,6 +2,7 @@ namespace Sensiolabs\GotenbergBundle\Builder\Screenshot; +use Psr\Log\LoggerInterface; use Sensiolabs\GotenbergBundle\Client\GotenbergClientInterface; use Sensiolabs\GotenbergBundle\Client\GotenbergResponse; use Sensiolabs\GotenbergBundle\Enum\Part; @@ -13,6 +14,8 @@ abstract class AbstractScreenshotBuilder implements ScreenshotBuilderInterface { + protected LoggerInterface|null $logger = null; + /** * @var array */ @@ -56,6 +59,11 @@ public function __construct( ]; } + public function setLogger(LoggerInterface|null $logger): void + { + $this->logger = $logger; + } + /** * @return array */ @@ -93,6 +101,10 @@ public function fileName(string $fileName, string $headerDisposition = HeaderUti public function generate(): GotenbergResponse { + $this->logger?->debug('Generating Screenshot file using {sensiolabs_gotenberg.builder} builder.', [ + 'sensiolabs_gotenberg.builder' => $this::class, + ]); + $pdfResponse = $this->gotenbergClient->call($this->getEndpoint(), $this->getMultipartFormData()); if (null !== $this->fileName) { diff --git a/src/Client/GotenbergClient.php b/src/Client/GotenbergClient.php index 2195618..e95a275 100644 --- a/src/Client/GotenbergClient.php +++ b/src/Client/GotenbergClient.php @@ -6,9 +6,9 @@ use Symfony\Component\Mime\Part\Multipart\FormDataPart; use Symfony\Contracts\HttpClient\HttpClientInterface; -final readonly class GotenbergClient implements GotenbergClientInterface +final class GotenbergClient implements GotenbergClientInterface { - public function __construct(private string $gotenbergBaseUri, private HttpClientInterface $client) + public function __construct(private readonly string $gotenbergBaseUri, private readonly HttpClientInterface $client) { } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 00a57b4..2e1bdff 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -28,7 +28,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->defaultValue('%kernel.project_dir%/assets') ->end() ->scalarNode('http_client') - ->info('HTTP Client reference to use. Defaults to "http_client".') + ->info('HTTP Client reference to use.') ->defaultValue('http_client') ->end() ->arrayNode('default_options') diff --git a/tests/Client/GotenbergClientTest.php b/tests/Client/GotenbergClientTest.php index 797dd7f..76c938b 100644 --- a/tests/Client/GotenbergClientTest.php +++ b/tests/Client/GotenbergClientTest.php @@ -44,7 +44,7 @@ public function testCallIsCorrectlyFormatted(): void self::assertSame('http://localhost:3000/some/url', $mockResponse->getRequestUrl()); $requestHeaders = array_reduce($mockResponse->getRequestOptions()['headers'], function (array $carry, string $header): array { - [$key, $value] = \explode(': ', $header, 2); + [$key, $value] = explode(': ', $header, 2); $carry[$key] ??= []; $carry[$key][] = $value; diff --git a/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php b/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php index 8b0a239..0a78cf1 100644 --- a/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php +++ b/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php @@ -199,7 +199,7 @@ public function testGotenbergConfiguredWithValidConfig(): void foreach ($builder as $builderName => $expectedConfig) { $gotenbergDefinition = $containerBuilder->getDefinition(".sensiolabs_gotenberg.{$builderType}_builder.{$builderName}"); $methodCalls = $gotenbergDefinition->getMethodCalls(); - $setConfiguration = $methodCalls[0]; + $setConfiguration = $methodCalls[1]; $config = $setConfiguration[1][0]; From 875168f1d6c16239180003c4d311d74ba7d7dda7 Mon Sep 17 00:00:00 2001 From: Adrien Roches Date: Wed, 5 Jun 2024 16:47:50 +0200 Subject: [PATCH 2/2] [UPDATE] Fix tests --- tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php | 2 +- tests/Kernel.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php b/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php index 0d987b5..ec5b5bf 100644 --- a/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php +++ b/tests/DependencyInjection/SensiolabsGotenbergExtensionTest.php @@ -244,7 +244,7 @@ public function testUrlBuildersCanChangeTheirRequestContext(string $serviceName) self::assertSame('https://sensiolabs.com', $requestContextDefinition->getArgument(0)); $urlBuilderDefinition = $containerBuilder->getDefinition($serviceName); - self::assertCount(2, $urlBuilderDefinition->getMethodCalls()); + self::assertCount(3, $urlBuilderDefinition->getMethodCalls()); $indexedMethodCalls = []; foreach ($urlBuilderDefinition->getMethodCalls() as $methodCall) { diff --git a/tests/Kernel.php b/tests/Kernel.php index 3f95812..ea7e244 100644 --- a/tests/Kernel.php +++ b/tests/Kernel.php @@ -2,6 +2,7 @@ namespace Sensiolabs\GotenbergBundle\Tests; +use Psr\Log\NullLogger; use Sensiolabs\GotenbergBundle\GotenbergInterface; use Sensiolabs\GotenbergBundle\SensiolabsGotenbergBundle; use Symfony\Bundle\FrameworkBundle\FrameworkBundle; @@ -9,6 +10,7 @@ use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\HttpKernel\Kernel as BaseKernel; @@ -43,5 +45,6 @@ public function registerBundles(): iterable public function process(ContainerBuilder $container): void { $container->getAlias(GotenbergInterface::class)->setPublic(true); + $container->setDefinition('logger', new Definition(NullLogger::class)); } }