From d7dc8469eb69fa8af3a85b02894dadea7ec0b425 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Fri, 15 May 2026 16:26:15 +0300 Subject: [PATCH 01/12] fix: reset on exception --- src/Messenger/Middleware/BaggageSchemaMiddleware.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Messenger/Middleware/BaggageSchemaMiddleware.php b/src/Messenger/Middleware/BaggageSchemaMiddleware.php index 04d7e7a..32e9911 100644 --- a/src/Messenger/Middleware/BaggageSchemaMiddleware.php +++ b/src/Messenger/Middleware/BaggageSchemaMiddleware.php @@ -31,9 +31,11 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope ->setBaggage($stamp->baggage === null ? null : $this->baggageCodec->decode($stamp->baggage)); } - $result = $stack->next()->handle($envelope, $stack); - - $this->baggageSchemaResolver->reset(); + try { + $result = $stack->next()->handle($envelope, $stack); + } finally { + $this->baggageSchemaResolver->reset(); + } return $result; } From c8d7f111bd464c0152ccda2136edb21538e31ad2 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Fri, 15 May 2026 16:52:31 +0300 Subject: [PATCH 02/12] fix: reset on exception --- .github/workflows/static-analysis.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/static-analysis.yaml b/.github/workflows/static-analysis.yaml index 8796ae1..088c0b5 100644 --- a/.github/workflows/static-analysis.yaml +++ b/.github/workflows/static-analysis.yaml @@ -36,7 +36,7 @@ jobs: run: composer install --no-progress --no-interaction --prefer-dist - name: Run script - run: vendor/bin/phpstan analyse + run: vendor/bin/phpstan analyse --configuration=./phpstan.neon composer-validate: name: Composer validate From c6c1fc29bf15c9026073ffccb54bdc0e23418227 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Fri, 15 May 2026 16:54:16 +0300 Subject: [PATCH 03/12] fix: reset on exception --- phpstan.neon | 5 ----- 1 file changed, 5 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index f6ecc8a..1494f51 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,8 +3,3 @@ parameters: paths: - src - tests - ignoreErrors: - - - message: '~Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition::children\(\).~' - count: 1 - path: ./src/DependencyInjection From e1ae9319a76a9eb58e5fdf146ab5f68f8fa95dc8 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Wed, 20 May 2026 10:40:08 +0300 Subject: [PATCH 04/12] fix: handle set schema errors --- src/Messenger/Middleware/BaggageSchemaMiddleware.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Messenger/Middleware/BaggageSchemaMiddleware.php b/src/Messenger/Middleware/BaggageSchemaMiddleware.php index 24a0973..85c952b 100644 --- a/src/Messenger/Middleware/BaggageSchemaMiddleware.php +++ b/src/Messenger/Middleware/BaggageSchemaMiddleware.php @@ -28,13 +28,13 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope $stamp = $envelope->last(BaggageSchemaStamp::class); if ($this->isWorker($envelope) && !$this->isSyncTransport($envelope)) { - if ($stamp instanceof BaggageSchemaStamp) { - $this->baggageSchemaResolver - ->setSchema($stamp->schema) - ->setBaggage($stamp->baggage === null ? null : $this->baggageCodec->decode($stamp->baggage)); - } - try { + if ($stamp instanceof BaggageSchemaStamp) { + $this->baggageSchemaResolver + ->setSchema($stamp->schema) + ->setBaggage($stamp->baggage === null ? null : $this->baggageCodec->decode($stamp->baggage)); + } + $result = $stack->next()->handle($envelope, $stack); } finally { $this->baggageSchemaResolver->reset(); From d0bdd8f1f94f916db0a310425371c65a31cb1fe1 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Fri, 5 Jun 2026 14:57:56 +0300 Subject: [PATCH 05/12] feat: added optional debug logger --- config/services.yaml | 6 ++ src/EventListener/BaggageRequestListener.php | 3 + src/HttpClient/BaggageAwareHttpClient.php | 6 +- src/Logger/DebugLogger.php | 80 +++++++++++++++++++ .../Middleware/BaggageSchemaMiddleware.php | 14 +++- src/Service/BaggageSchemaResolver.php | 6 ++ .../BaggageRequestListenerTest.php | 37 +++++++-- .../HttpClient/BaggageAwareHttpClientTest.php | 7 +- .../BaggageSchemaMiddlewareTest.php | 46 +++++++++-- 9 files changed, 190 insertions(+), 15 deletions(-) create mode 100644 src/Logger/DebugLogger.php diff --git a/config/services.yaml b/config/services.yaml index d0ef403..9b34002 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -9,6 +9,7 @@ services: $environmentSchema: '%schema_context.environment_schema%' $environmentName: '%schema_context.environment_name%' $schemaOverridableEnvironments: '%schema_context.overridable_environments%' + $logger: '@Macpaw\SchemaContextBundle\Logger\DebugLogger' public: true shared: true @@ -20,6 +21,7 @@ services: arguments: $baggageSchemaResolver: '@Macpaw\SchemaContextBundle\Service\BaggageSchemaResolver' $schemaRequestHeader: '%schema_context.header_name%' + $logger: '@Macpaw\SchemaContextBundle\Logger\DebugLogger' tags: - { name: kernel.event_subscriber } @@ -28,3 +30,7 @@ services: $sendersLocator: '@messenger.senders_locator' tags: - { name: messenger.middleware } + + Macpaw\SchemaContextBundle\Logger\DebugLogger: + arguments: + $logger: null diff --git a/src/EventListener/BaggageRequestListener.php b/src/EventListener/BaggageRequestListener.php index 936bf85..e0e0d4f 100644 --- a/src/EventListener/BaggageRequestListener.php +++ b/src/EventListener/BaggageRequestListener.php @@ -4,6 +4,7 @@ namespace Macpaw\SchemaContextBundle\EventListener; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Service\BaggageCodec; use Macpaw\SchemaContextBundle\Service\BaggageSchemaResolver; use Symfony\Component\HttpKernel\Event\RequestEvent; @@ -16,6 +17,7 @@ public function __construct( private BaggageSchemaResolver $baggageSchemaResolver, private BaggageCodec $baggageCodec, private string $schemaRequestHeader, + private DebugLogger $logger, ) { } @@ -37,6 +39,7 @@ public function onKernelRequest(RequestEvent $event): void $schema = $baggage[$this->schemaRequestHeader] ?? null; } + $this->logger->logInfoFromRequest($baggage, $schema); $this->baggageSchemaResolver->setBaggage($baggage); $this->baggageSchemaResolver->setSchema($schema); } diff --git a/src/HttpClient/BaggageAwareHttpClient.php b/src/HttpClient/BaggageAwareHttpClient.php index f4d4c45..20a8900 100644 --- a/src/HttpClient/BaggageAwareHttpClient.php +++ b/src/HttpClient/BaggageAwareHttpClient.php @@ -4,6 +4,7 @@ namespace Macpaw\SchemaContextBundle\HttpClient; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Service\BaggageCodec; use Symfony\Contracts\HttpClient\HttpClientInterface; use Symfony\Contracts\HttpClient\ResponseInterface; @@ -16,6 +17,7 @@ public function __construct( private HttpClientInterface $inner, private BaggageSchemaResolver $baggageSchemaResolver, private BaggageCodec $baggageCodec, + private DebugLogger $logger, ) { } @@ -40,6 +42,8 @@ public function request(string $method, string $url, array $options = []): Respo $headers['baggage'] = $this->baggageCodec->encode($baggage); $options['headers'] = $headers; + $this->logger->logHttpRequest($baggage); + return $this->inner->request($method, $url, $options); } @@ -56,6 +60,6 @@ public function withOptions(array $options): static $wrapped = $this->inner->withOptions($options); /** @phpstan-ignore-next-line */ - return new self($wrapped, $this->baggageSchemaResolver, $this->baggageCodec); + return new self($wrapped, $this->baggageSchemaResolver, $this->baggageCodec, $this->logger); } } diff --git a/src/Logger/DebugLogger.php b/src/Logger/DebugLogger.php new file mode 100644 index 0000000..7fdc746 --- /dev/null +++ b/src/Logger/DebugLogger.php @@ -0,0 +1,80 @@ +logger = $logger ?? new NullLogger(); + } + + public function log(string $message, ?array $baggage = null, ?string $schema = null): void + { + $this->logger->info( + 'schema_context_' . $message, + [ + 'schema' => $schema, + 'baggage' => $baggage, + ] + ); + } + + public function logInfoFromRequest(array|null $baggage, string|null $schema): void + { + $this->log('info_from_request', $baggage, $schema); + } + + public function logHttpRequest(array $baggage): void + { + $this->log('http_request', $baggage); + } + + public function logSetBaggage(array|null $baggage): void + { + $this->log('set_baggage', $baggage); + } + + public function logSetSchema(string|null $schema): void + { + $this->log('set_schema', null, $schema); + } + + public function logInfoFromStamp(array|null $baggage, string|null $schema): void + { + $this->log('info_from_stamp', $baggage, $schema); + } + + public function logResetWorkerAfterWorker(): void + { + $this->log('reset_worker_after_worker'); + } + + public function logCreateMessage(array|null $baggage, string|null $schema): void + { + $this->log('create_message', $baggage, $schema); + } + + public function logApplySearchPath(string $schema, bool $isNewConnection): void + { + $this->logger->info('schema_context_apply_search_path', [ + 'schema' => $schema, + 'is_new_connection' => $isNewConnection, + ]); + } + + public function logSkipSearchPath(string $schema): void + { + $this->logger->info('schema_context_skip_search_path', [ + 'schema' => $schema, + ]); + } +} diff --git a/src/Messenger/Middleware/BaggageSchemaMiddleware.php b/src/Messenger/Middleware/BaggageSchemaMiddleware.php index 85c952b..3a9251e 100644 --- a/src/Messenger/Middleware/BaggageSchemaMiddleware.php +++ b/src/Messenger/Middleware/BaggageSchemaMiddleware.php @@ -4,6 +4,7 @@ namespace Macpaw\SchemaContextBundle\Messenger\Middleware; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Messenger\Stamp\BaggageSchemaStamp; use Macpaw\SchemaContextBundle\Service\BaggageCodec; use Macpaw\SchemaContextBundle\Service\BaggageSchemaResolver; @@ -20,6 +21,7 @@ public function __construct( private SendersLocatorInterface $sendersLocator, private BaggageSchemaResolver $baggageSchemaResolver, private BaggageCodec $baggageCodec, + private DebugLogger $logger, ) { } @@ -30,13 +32,19 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope if ($this->isWorker($envelope) && !$this->isSyncTransport($envelope)) { try { if ($stamp instanceof BaggageSchemaStamp) { + $schema = $stamp->schema; + $baggage = $stamp->baggage === null ? null : $this->baggageCodec->decode($stamp->baggage); + + $this->logger->logInfoFromStamp($baggage, $schema); + $this->baggageSchemaResolver - ->setSchema($stamp->schema) - ->setBaggage($stamp->baggage === null ? null : $this->baggageCodec->decode($stamp->baggage)); + ->setSchema($schema) + ->setBaggage($baggage); } $result = $stack->next()->handle($envelope, $stack); } finally { + $this->logger->logResetWorkerAfterWorker(); $this->baggageSchemaResolver->reset(); } @@ -48,6 +56,8 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope ? null : $this->baggageCodec->encode($this->baggageSchemaResolver->getBaggage()); + $this->logger->logCreateMessage($this->baggageSchemaResolver->getBaggage(), $schema); + $envelope = $envelope->with(new BaggageSchemaStamp($schema, $baggage)); return $stack->next()->handle($envelope, $stack); diff --git a/src/Service/BaggageSchemaResolver.php b/src/Service/BaggageSchemaResolver.php index 207c677..4c6ee96 100644 --- a/src/Service/BaggageSchemaResolver.php +++ b/src/Service/BaggageSchemaResolver.php @@ -5,6 +5,7 @@ namespace Macpaw\SchemaContextBundle\Service; use Macpaw\SchemaContextBundle\Exception\EnvironmentSchemaMismatchException; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; class BaggageSchemaResolver { @@ -22,6 +23,7 @@ public function __construct( private readonly string $environmentSchema, private readonly string $environmentName, private readonly array $schemaOverridableEnvironments, + private readonly DebugLogger $logger, ) { $this->isSchemaOverridableEnvironment = in_array( $this->environmentName, @@ -47,6 +49,8 @@ public function setBaggage(?array $baggage): self $baggage = null; } + $this->logger->logSetBaggage($baggage); + $this->baggage = $baggage; return $this; @@ -74,6 +78,8 @@ public function setSchema(?string $schema): self ); } + $this->logger->logSetSchema($schema); + $this->schema = $schema; return $this; diff --git a/tests/EventListener/BaggageRequestListenerTest.php b/tests/EventListener/BaggageRequestListenerTest.php index e5b7b00..3dddde0 100644 --- a/tests/EventListener/BaggageRequestListenerTest.php +++ b/tests/EventListener/BaggageRequestListenerTest.php @@ -5,6 +5,7 @@ namespace Macpaw\SchemaContextBundle\Tests\EventListener; use Macpaw\SchemaContextBundle\EventListener\BaggageRequestListener; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Service\BaggageCodec; use Macpaw\SchemaContextBundle\Service\BaggageSchemaResolver; use PHPUnit\Framework\TestCase; @@ -20,12 +21,18 @@ public function testBaggageFromHeaderIsSet(): void $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + new DebugLogger(), + ); $baggageCodec = new BaggageCodec(); $listener = new BaggageRequestListener( $resolver, $baggageCodec, 'X-Schema', + new DebugLogger(), ); $request = new Request([], [], [], [], [], ['HTTP_BAGGAGE' => 'X-Schema=tenant1']); @@ -46,12 +53,19 @@ public function testBaggageFromHeaderIsSetWithMultiplyParameters(): void $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $logger = new DebugLogger(); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger, + ); $baggageCodec = new BaggageCodec(); $listener = new BaggageRequestListener( $resolver, $baggageCodec, 'X-Schema', + $logger, ); $request = new Request([], [], [], [], [], ['HTTP_BAGGAGE' => 'X-Schema= tenant1 ,test , foo=bar']); @@ -74,12 +88,19 @@ public function testDefaultSchemaIsUsedIfHeaderMissing(): void $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $logger = new DebugLogger(); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger + ); $baggageCodec = new BaggageCodec(); $listener = new BaggageRequestListener( $resolver, $baggageCodec, 'X-Schema', + $logger, ); $request = new Request(); @@ -92,19 +113,25 @@ public function testDefaultSchemaIsUsedIfHeaderMissing(): void self::assertNull($resolver->getBaggage()); } - // TODO!! public function testFail(): void { $environmentSchema = 'default'; $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $logger = new DebugLogger(); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger, + ); $baggageCodec = new BaggageCodec(); $listener = new BaggageRequestListener( $resolver, $baggageCodec, 'X-Schema', + $logger, ); $request = new Request([], [], [], [], [], ['HTTP_BAGGAGE' => 'X-Schema=tenant1']); diff --git a/tests/HttpClient/BaggageAwareHttpClientTest.php b/tests/HttpClient/BaggageAwareHttpClientTest.php index 38d9c07..30f9048 100644 --- a/tests/HttpClient/BaggageAwareHttpClientTest.php +++ b/tests/HttpClient/BaggageAwareHttpClientTest.php @@ -5,6 +5,7 @@ namespace Macpaw\SchemaContextBundle\Tests\HttpClient; use Macpaw\SchemaContextBundle\HttpClient\BaggageAwareHttpClient; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Service\BaggageCodec; use Macpaw\SchemaContextBundle\Service\BaggageSchemaResolver; use PHPUnit\Framework\Attributes\DataProvider; @@ -27,10 +28,13 @@ public function testItInjectsSchemaIntoBaggageHeader( $environmentSchema = 'default'; $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; + + $logger = new DebugLogger(); $baggageSchemaResolver = new BaggageSchemaResolver( $environmentSchema, $environmentName, - $schemaOverridableEnvironments + $schemaOverridableEnvironments, + $logger, ); $mockClient = $this->createMock(HttpClientInterface::class); @@ -56,6 +60,7 @@ public function testItInjectsSchemaIntoBaggageHeader( $mockClient, $baggageSchemaResolver, $baggageCodec, + $logger, ); $response = $client->request('GET', 'https://api.example.com/test', [ diff --git a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php index bccd3d6..9440693 100644 --- a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php +++ b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php @@ -4,6 +4,7 @@ namespace Macpaw\SchemaContextBundle\Tests\Messenger\Middleware; +use Macpaw\SchemaContextBundle\Logger\DebugLogger; use Macpaw\SchemaContextBundle\Messenger\Middleware\BaggageSchemaMiddleware; use Macpaw\SchemaContextBundle\Messenger\Stamp\BaggageSchemaStamp; use Macpaw\SchemaContextBundle\Service\BaggageCodec; @@ -29,10 +30,21 @@ public function testSchemaIsSetFromStamp(): void 'X-Schema' => 'tenant1', ]; + $logger = new DebugLogger(); $sendersLocator = $this->createMock(SendersLocatorInterface::class); - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger, + ); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware( + $sendersLocator, + $resolver, + $baggageCodec, + $logger, + ); $stamp = new BaggageSchemaStamp($schema, $rawBaggage); $envelope = (new Envelope(new \stdClass()))->with($stamp); $envelope = $envelope->with(new ReceivedStamp('async')); @@ -76,13 +88,24 @@ public function testSchemaStampIsInjectedIfMissing(): void 'X-Schema' => 'tenant1', ]; + $logger = new DebugLogger(); $sendersLocator = $this->createMock(SendersLocatorInterface::class); - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger, + ); $resolver ->setSchema($schema) ->setBaggage($baggage); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware( + $sendersLocator, + $resolver, + $baggageCodec, + $logger, + ); $originalEnvelope = new Envelope(new \stdClass()); $stack = $this->createMock(StackInterface::class); @@ -112,10 +135,21 @@ public function testSchemaStampIsDefaultSchema(): void $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; + $logger = new DebugLogger(); $sendersLocator = $this->createMock(SendersLocatorInterface::class); - $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); + $resolver = new BaggageSchemaResolver( + $environmentSchema, + $environmentName, + $schemaOverridableEnvironments, + $logger, + ); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware( + $sendersLocator, + $resolver, + $baggageCodec, + $logger, + ); $originalEnvelope = new Envelope(new \stdClass()); $stack = $this->createMock(StackInterface::class); From a7aa491444788ebd967fb50a38349b6de61b34ce Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 13:53:32 +0300 Subject: [PATCH 06/12] chore: update package verions to fix security issues --- .github/workflows/ci.yaml | 5 ++--- composer.json | 11 ++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2a86d91..55591de 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,12 +17,11 @@ jobs: coverage: ['none'] symfony-versions: - '6.4.*' - - '7.0.*' - - '7.3.*' + - '7.4.*' include: - description: 'Log Code Coverage' php: '8.3' - symfony-versions: '^7.0' + symfony-versions: '^7.4' doctrine-orm-versions: '^3.0' coverage: xdebug diff --git a/composer.json b/composer.json index 37380b8..d992e6a 100644 --- a/composer.json +++ b/composer.json @@ -14,11 +14,12 @@ }, "require": { "php": ">=8.3", - "symfony/messenger": "^6.4 || ^7.0", - "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/config": "^6.4 || ^7.0", - "symfony/http-client": "^6.4 || ^7.0" + "symfony/messenger": "^6.4 || ^7.4", + "symfony/http-kernel": "^6.4 || ^7.4", + "symfony/dependency-injection": "^6.4 || ^7.4", + "symfony/config": "^6.4 || ^7.4", + "symfony/http-client": "^6.4 || ^7.4" + }, "require-dev": { "phpstan/phpstan": "^1.10", From 796d107afe4eda538fdc0f419a89042544074d1a Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 13:57:57 +0300 Subject: [PATCH 07/12] chore: add symfony 8.0.* check --- .github/workflows/ci.yaml | 1 + composer.json | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 55591de..ab914e7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,6 +18,7 @@ jobs: symfony-versions: - '6.4.*' - '7.4.*' + - '8.0.*' include: - description: 'Log Code Coverage' php: '8.3' diff --git a/composer.json b/composer.json index d992e6a..e783c96 100644 --- a/composer.json +++ b/composer.json @@ -14,11 +14,11 @@ }, "require": { "php": ">=8.3", - "symfony/messenger": "^6.4 || ^7.4", - "symfony/http-kernel": "^6.4 || ^7.4", - "symfony/dependency-injection": "^6.4 || ^7.4", - "symfony/config": "^6.4 || ^7.4", - "symfony/http-client": "^6.4 || ^7.4" + "symfony/messenger": "^6.4 || ^7.4 || ^8.0", + "symfony/http-kernel": "^6.4 || ^7.4 || ^8.0", + "symfony/dependency-injection": "^6.4 || ^7.4 || ^8.0", + "symfony/config": "^6.4 || ^7.4 || ^8.0", + "symfony/http-client": "^6.4 || ^7.4 || ^8.0" }, "require-dev": { From deafd2e8e7a205a160f67684a23aa687a1f0c857 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 13:59:17 +0300 Subject: [PATCH 08/12] chore: add php 8.4 check --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e783c96..558c0d4 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ } }, "require": { - "php": ">=8.3", + "php": ">=8.3 || >=8.4", "symfony/messenger": "^6.4 || ^7.4 || ^8.0", "symfony/http-kernel": "^6.4 || ^7.4 || ^8.0", "symfony/dependency-injection": "^6.4 || ^7.4 || ^8.0", From 1b3c3ef6c76b7e9fa896f1262003910e792c3b52 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 14:03:50 +0300 Subject: [PATCH 09/12] chore: prevent check php 8.3 and symfony 8.0.* --- .github/workflows/ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ab914e7..506bc58 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -19,6 +19,9 @@ jobs: - '6.4.*' - '7.4.*' - '8.0.*' + exclude: + - php: '8.3' + symfony-versions: '8.0.*' include: - description: 'Log Code Coverage' php: '8.3' From de1e751e83bdfdd7dc3812947785a3d32e18de06 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 14:07:51 +0300 Subject: [PATCH 10/12] chore: fix coverage check --- .github/workflows/ci.yaml | 2 +- composer.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 506bc58..5a2fe9e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,7 +25,7 @@ jobs: include: - description: 'Log Code Coverage' php: '8.3' - symfony-versions: '^7.4' + symfony-versions: '^6.4' doctrine-orm-versions: '^3.0' coverage: xdebug diff --git a/composer.json b/composer.json index 558c0d4..65b82ae 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,6 @@ "symfony/dependency-injection": "^6.4 || ^7.4 || ^8.0", "symfony/config": "^6.4 || ^7.4 || ^8.0", "symfony/http-client": "^6.4 || ^7.4 || ^8.0" - }, "require-dev": { "phpstan/phpstan": "^1.10", From 50bf943c8cf58305aa9056c4bae128597392e661 Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Mon, 22 Jun 2026 14:45:41 +0300 Subject: [PATCH 11/12] chore: update phpstan and fix errors --- composer.json | 4 +-- .../SchemaContextExtension.php | 32 ++++++++++++++++--- src/HttpClient/BaggageAwareHttpClient.php | 2 +- src/Logger/DebugLogger.php | 6 ++++ src/SchemaContextBundle.php | 2 +- .../HttpClient/BaggageAwareHttpClientTest.php | 2 +- .../BaggageSchemaMiddlewareTest.php | 1 + 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 65b82ae..2105936 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "symfony/http-client": "^6.4 || ^7.4 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^2.0", "phpunit/phpunit": "^10.0", "squizlabs/php_codesniffer": "3.7.*" }, @@ -44,7 +44,7 @@ "vendor/bin/phpcbf" ], "phpstan": [ - "vendor/bin/phpstan analyse" + "vendor/bin/phpstan analyse --memory-limit=512M" ], "phpunit": [ "vendor/bin/phpunit" diff --git a/src/DependencyInjection/SchemaContextExtension.php b/src/DependencyInjection/SchemaContextExtension.php index ae3cef6..793e62f 100644 --- a/src/DependencyInjection/SchemaContextExtension.php +++ b/src/DependencyInjection/SchemaContextExtension.php @@ -4,6 +4,7 @@ namespace Macpaw\SchemaContextBundle\DependencyInjection; +use LogicException; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; @@ -11,15 +12,36 @@ class SchemaContextExtension extends Extension { - public function load(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container): void { $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); - $container->setParameter('schema_context.header_name', $config['header_name']); - $container->setParameter('schema_context.environment_schema', $config['environment_schema']); - $container->setParameter('schema_context.environment_name', $config['environment_name']); - $container->setParameter('schema_context.overridable_environments', $config['overridable_environments']); + $headerName = $config['header_name']; + $environmentSchema = $config['environment_schema']; + $environmentName = $config['environment_name']; + $overridableEnvironments = $config['overridable_environments']; + + if (!is_string($headerName)) { + throw new LogicException('Configuration "header_name" must be a string'); + } + + if (!is_string($environmentSchema)) { + throw new LogicException('Configuration "environment_schema" must be a string'); + } + + if (!is_string($environmentName)) { + throw new LogicException('Configuration "environment_name" must be a string'); + } + + if (!is_array($overridableEnvironments)) { + throw new LogicException('Configuration "overridable_environments" must be an array'); + } + + $container->setParameter('schema_context.header_name', $headerName); + $container->setParameter('schema_context.environment_schema', $environmentSchema); + $container->setParameter('schema_context.environment_name', $environmentName); + $container->setParameter('schema_context.overridable_environments', $overridableEnvironments); $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../../config')); diff --git a/src/HttpClient/BaggageAwareHttpClient.php b/src/HttpClient/BaggageAwareHttpClient.php index 20a8900..3a4fcaf 100644 --- a/src/HttpClient/BaggageAwareHttpClient.php +++ b/src/HttpClient/BaggageAwareHttpClient.php @@ -30,7 +30,7 @@ public function request(string $method, string $url, array $options = []): Respo ? $options['headers'] : []; - $baggage = isset($headers['baggage']) + $baggage = isset($headers['baggage']) && is_string($headers['baggage']) ? $this->baggageCodec->decode($headers['baggage']) : []; diff --git a/src/Logger/DebugLogger.php b/src/Logger/DebugLogger.php index 7fdc746..c1fc55c 100644 --- a/src/Logger/DebugLogger.php +++ b/src/Logger/DebugLogger.php @@ -17,6 +17,7 @@ public function __construct( $this->logger = $logger ?? new NullLogger(); } + /** @param array|null $baggage */ public function log(string $message, ?array $baggage = null, ?string $schema = null): void { $this->logger->info( @@ -28,16 +29,19 @@ public function log(string $message, ?array $baggage = null, ?string $schema = n ); } + /** @param array|null $baggage */ public function logInfoFromRequest(array|null $baggage, string|null $schema): void { $this->log('info_from_request', $baggage, $schema); } + /** @param array $baggage */ public function logHttpRequest(array $baggage): void { $this->log('http_request', $baggage); } + /** @param array|null $baggage */ public function logSetBaggage(array|null $baggage): void { $this->log('set_baggage', $baggage); @@ -48,6 +52,7 @@ public function logSetSchema(string|null $schema): void $this->log('set_schema', null, $schema); } + /** @param array|null $baggage */ public function logInfoFromStamp(array|null $baggage, string|null $schema): void { $this->log('info_from_stamp', $baggage, $schema); @@ -58,6 +63,7 @@ public function logResetWorkerAfterWorker(): void $this->log('reset_worker_after_worker'); } + /** @param array|null $baggage */ public function logCreateMessage(array|null $baggage, string|null $schema): void { $this->log('create_message', $baggage, $schema); diff --git a/src/SchemaContextBundle.php b/src/SchemaContextBundle.php index b4464be..7b71240 100644 --- a/src/SchemaContextBundle.php +++ b/src/SchemaContextBundle.php @@ -11,7 +11,7 @@ class SchemaContextBundle extends Bundle { - public function build(ContainerBuilder $container) + public function build(ContainerBuilder $container): void { $container->addCompilerPass( new SchemaContextCompilerPass(), diff --git a/tests/HttpClient/BaggageAwareHttpClientTest.php b/tests/HttpClient/BaggageAwareHttpClientTest.php index 30f9048..d129ecd 100644 --- a/tests/HttpClient/BaggageAwareHttpClientTest.php +++ b/tests/HttpClient/BaggageAwareHttpClientTest.php @@ -45,7 +45,7 @@ public function testItInjectsSchemaIntoBaggageHeader( 'GET', 'https://api.example.com/test', $this->callback(function (array $options) use ($expectedSentBaggage) { - $headers = $options['headers'] ?? []; + $headers = is_array($options['headers'] ?? null) ? $options['headers'] : []; $baggage = $headers['baggage'] ?? null; return $baggage === $expectedSentBaggage; diff --git a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php index 9440693..dd650e7 100644 --- a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php +++ b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php @@ -71,6 +71,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope $result = (array) $envelope->getMessage(); $this->assertSame($schema, $result['schema']); + $this->assertIsString($result['baggage']); $this->assertSame($baggage, $baggageCodec->decode($result['baggage'])); $this->assertSame($environmentSchema, $resolver->getSchema()); $this->assertNull($resolver->getBaggage()); From ad72191a46a3fc31f4bcf71846f18389558829bd Mon Sep 17 00:00:00 2001 From: Aleksey Tupichenkov Date: Thu, 2 Jul 2026 17:26:42 +0300 Subject: [PATCH 12/12] fix: add more logs for debug --- src/Logger/DebugLogger.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Logger/DebugLogger.php b/src/Logger/DebugLogger.php index c1fc55c..689d854 100644 --- a/src/Logger/DebugLogger.php +++ b/src/Logger/DebugLogger.php @@ -77,10 +77,11 @@ public function logApplySearchPath(string $schema, bool $isNewConnection): void ]); } - public function logSkipSearchPath(string $schema): void + public function logSkipSearchPath(string $schema, string|null $actualScheme): void { $this->logger->info('schema_context_skip_search_path', [ 'schema' => $schema, + 'actualScheme' => $actualScheme, ]); } }