From c6dd15e040510ae0ade05f1ce90f41e44ad03da6 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Wed, 18 Sep 2024 23:58:45 +0400 Subject: [PATCH 01/10] Fix Core tests --- src/Core/composer.json | 1 - src/Core/phpunit.xml | 2 +- src/Core/tests/bootstrap.php | 13 +++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/Core/tests/bootstrap.php diff --git a/src/Core/composer.json b/src/Core/composer.json index 12dc8379c..15a1381c4 100644 --- a/src/Core/composer.json +++ b/src/Core/composer.json @@ -35,7 +35,6 @@ "require": { "php": ">=8.1", "psr/container": "^1.1|^2.0", - "spiral/core": "^3.15", "spiral/security": "^3.15" }, "require-dev": { diff --git a/src/Core/phpunit.xml b/src/Core/phpunit.xml index d3d12dff0..2b2fef6ee 100644 --- a/src/Core/phpunit.xml +++ b/src/Core/phpunit.xml @@ -1,5 +1,5 @@ - Date: Fri, 20 Sep 2024 22:32:50 +0400 Subject: [PATCH 02/10] More compatible Handler resolving in RouterBootloader --- src/Framework/Bootloader/Http/RouterBootloader.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Framework/Bootloader/Http/RouterBootloader.php b/src/Framework/Bootloader/Http/RouterBootloader.php index b8ec10e11..359a913b4 100644 --- a/src/Framework/Bootloader/Http/RouterBootloader.php +++ b/src/Framework/Bootloader/Http/RouterBootloader.php @@ -59,7 +59,7 @@ public function defineSingletons(): array ->bindSingleton(RouteInterface::class, [self::class, 'route']); return [ - HandlerInterface::class => Core::class, + HandlerInterface::class => [self::class, 'handler'], CoreInterface::class => Core::class, RouterInterface::class => [self::class, 'router'], RequestHandlerInterface::class => RouterInterface::class, @@ -107,6 +107,13 @@ private function router( ); } + private function handler(?CoreInterface $core = null, ContainerInterface $container): HandlerInterface + { + return $core instanceof HandlerInterface + ? $core + : $container->get(Core::class); + } + /** * @noRector RemoveUnusedPrivateMethodRector */ From d2eb1afc28839be445b2e38559de07c0f6f4f305 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Fri, 20 Sep 2024 22:43:43 +0400 Subject: [PATCH 03/10] Fix tests for DebugBootloader --- .../Bootloader/Debug/DebugBootloaderTest.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tests/Framework/Bootloader/Debug/DebugBootloaderTest.php b/tests/Framework/Bootloader/Debug/DebugBootloaderTest.php index 7dde23d47..a6fe9bbc8 100644 --- a/tests/Framework/Bootloader/Debug/DebugBootloaderTest.php +++ b/tests/Framework/Bootloader/Debug/DebugBootloaderTest.php @@ -22,11 +22,6 @@ final class DebugBootloaderTest extends BaseTestCase { - public function testEnvironmentCollectorBinding(): void - { - $this->assertContainerBoundAsSingleton(EnvironmentCollector::class, EnvironmentCollector::class); - } - public function testStateInterfaceBinding(): void { $this->assertContainerBound(StateInterface::class, State::class); @@ -40,7 +35,7 @@ public function testAddCollector(): void $collector = $this->createMock(StateCollectorInterface::class); $autowire = new Autowire('foo'); - $bootloader = new DebugBootloader($this->getContainer(), $this->getContainer(), $configs); + $bootloader = new DebugBootloader($this->getContainer(), $configs); $bootloader->addStateCollector('foo'); $bootloader->addStateCollector($collector); $bootloader->addStateCollector($autowire); @@ -61,7 +56,7 @@ public function __toString(): string }; $fn = static fn (mixed $a): string => 'value 3'; - $bootloader = new DebugBootloader($this->getContainer(), $this->getContainer(), $configs); + $bootloader = new DebugBootloader($this->getContainer(), $configs); $bootloader->addTag('foo', 'value 1'); $bootloader->addTag('bar', $class); $bootloader->addTag('baz', $fn); @@ -104,9 +99,10 @@ public function testResolveTagCallableDeps(): void $configs = new ConfigManager($this->createMock(LoaderInterface::class)); $configs->setDefaults(DebugConfig::CONFIG, ['tags' => []]); - $bootloader = new DebugBootloader($this->getContainer(), $this->getContainer(), $configs); + $bootloader = new DebugBootloader($this->getContainer(), $configs); $ref = new \ReflectionMethod($bootloader, 'state'); - $state = $ref->invoke($bootloader, new DebugConfig([ + /** @see DebugBootloader::state() */ + $state = $ref->invoke($bootloader, $this->getContainer(), new DebugConfig([ 'tags' => [ 'env' => static fn (AppEnvironment $env): string => $env->isProduction() ? 'prod' : 'dev' ], From d70b1ed12f3e140bce7ca0b2b597fed3a1ee1095 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sat, 21 Sep 2024 00:11:48 +0400 Subject: [PATCH 04/10] Router: Fix opening custom scopes in middleware --- src/Router/composer.json | 2 +- src/Router/src/CoreHandler.php | 1 - src/Router/src/Target/AbstractTarget.php | 5 +- src/Router/tests/ContainerScopeTest.php | 46 +++++++++++++++++++ src/Router/tests/Fixtures/TestController.php | 7 +++ src/Router/tests/MiddlewareTest.php | 7 +-- .../tests/{ => Stub}/HeaderMiddleware.php | 2 +- .../tests/Stub/IdentityScopedMiddleware.php | 30 ++++++++++++ 8 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 src/Router/tests/ContainerScopeTest.php rename src/Router/tests/{ => Stub}/HeaderMiddleware.php (93%) create mode 100644 src/Router/tests/Stub/IdentityScopedMiddleware.php diff --git a/src/Router/composer.json b/src/Router/composer.json index 48fa64d71..95dacefb6 100644 --- a/src/Router/composer.json +++ b/src/Router/composer.json @@ -47,7 +47,7 @@ "require-dev": { "phpunit/phpunit": "^10.1", "mockery/mockery": "^1.5", - "nyholm/psr7": "^1.5", + "spiral/nyholm-bridge": "^1.3", "vimeo/psalm": "^5.9" }, "autoload": { diff --git a/src/Router/src/CoreHandler.php b/src/Router/src/CoreHandler.php index 6a3bef760..1624ee7a2 100644 --- a/src/Router/src/CoreHandler.php +++ b/src/Router/src/CoreHandler.php @@ -9,7 +9,6 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Server\RequestHandlerInterface; use Spiral\Core\CoreInterface; -use Spiral\Core\Exception\ControllerException; use Spiral\Core\Scope; use Spiral\Core\ScopeInterface; use Spiral\Http\Exception\ClientException; diff --git a/src/Router/src/Target/AbstractTarget.php b/src/Router/src/Target/AbstractTarget.php index dffbf5631..7e18d81bb 100644 --- a/src/Router/src/Target/AbstractTarget.php +++ b/src/Router/src/Target/AbstractTarget.php @@ -9,6 +9,7 @@ use Psr\Http\Message\ResponseFactoryInterface; use Psr\Http\Server\RequestHandlerInterface as Handler; use Spiral\Core\CoreInterface; +use Spiral\Core\Internal\Proxy; use Spiral\Core\ScopeInterface; use Spiral\Interceptors\Handler\AutowireHandler; use Spiral\Interceptors\HandlerInterface; @@ -89,6 +90,8 @@ protected function coreHandler(ContainerInterface $container): CoreHandler return $this->handler; } + $scope = Proxy::create(new \ReflectionClass(ScopeInterface::class), null, new \Spiral\Core\Attribute\Proxy()); + try { // construct on demand $this->handler = new CoreHandler( @@ -97,7 +100,7 @@ protected function coreHandler(ContainerInterface $container): CoreHandler $container->has(HandlerInterface::class) => new AutowireHandler($container), default => $container->get(HandlerInterface::class), }, - $container->get(ScopeInterface::class), + $scope, $container->get(ResponseFactoryInterface::class), $container->get(TracerInterface::class) ); diff --git a/src/Router/tests/ContainerScopeTest.php b/src/Router/tests/ContainerScopeTest.php new file mode 100644 index 000000000..6e450e982 --- /dev/null +++ b/src/Router/tests/ContainerScopeTest.php @@ -0,0 +1,46 @@ +getRouter(); + + $router->setRoute( + 'group', + (new Route('/[/[/]]', new Group([ + 'test' => TestController::class, + ])))->withMiddleware(IdentityScopedMiddleware::class), + ); + + $this->fakeHttp()->get('/test/scopes')->assertBodySame('http-request, idenity, http, root'); + $this->fakeHttp()->get('/test/scopes')->assertBodySame('http-request, idenity, http, root'); + } + + private function getRouter(): RouterInterface + { + return $this->getContainer()->get(RouterInterface::class); + } +} diff --git a/src/Router/tests/Fixtures/TestController.php b/src/Router/tests/Fixtures/TestController.php index e854834f2..efe6ef03d 100644 --- a/src/Router/tests/Fixtures/TestController.php +++ b/src/Router/tests/Fixtures/TestController.php @@ -6,6 +6,7 @@ use Spiral\Core\Exception\ControllerException; use Nyholm\Psr7\Response; +use Spiral\Core\Internal\Introspector; class TestController { @@ -89,4 +90,10 @@ public function deleteTarget(): string { return 'DELETE'; } + + public function scopes(): string + { + $scopes = Introspector::scopeNames(); + return \implode(', ', $scopes); + } } diff --git a/src/Router/tests/MiddlewareTest.php b/src/Router/tests/MiddlewareTest.php index 48b64599d..aa114d21c 100644 --- a/src/Router/tests/MiddlewareTest.php +++ b/src/Router/tests/MiddlewareTest.php @@ -4,14 +4,15 @@ namespace Spiral\Tests\Router; +use Nyholm\Psr7\ServerRequest; +use Nyholm\Psr7\Uri; use Spiral\Router\Exception\RouteException; use Spiral\Router\Route; use Spiral\Router\Target\Group; +use Spiral\Router\UriHandler; use Spiral\Tests\Router\Diactoros\UriFactory; use Spiral\Tests\Router\Fixtures\TestController; -use Spiral\Router\UriHandler; -use Nyholm\Psr7\ServerRequest; -use Nyholm\Psr7\Uri; +use Spiral\Tests\Router\Stub\HeaderMiddleware; class MiddlewareTest extends BaseTestCase { diff --git a/src/Router/tests/HeaderMiddleware.php b/src/Router/tests/Stub/HeaderMiddleware.php similarity index 93% rename from src/Router/tests/HeaderMiddleware.php rename to src/Router/tests/Stub/HeaderMiddleware.php index d872c9c49..e2986746c 100644 --- a/src/Router/tests/HeaderMiddleware.php +++ b/src/Router/tests/Stub/HeaderMiddleware.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Spiral\Tests\Router; +namespace Spiral\Tests\Router\Stub; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; diff --git a/src/Router/tests/Stub/IdentityScopedMiddleware.php b/src/Router/tests/Stub/IdentityScopedMiddleware.php new file mode 100644 index 000000000..e96874799 --- /dev/null +++ b/src/Router/tests/Stub/IdentityScopedMiddleware.php @@ -0,0 +1,30 @@ +scope->runScope( + new Scope(name: 'idenity', bindings: ['identity' => 'test-identity']), + fn() => $handler->handle($request), + ); + } +} From 24d81d70b9202b6d46f434998b9c4d6a6eb806ea Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sat, 21 Sep 2024 00:30:28 +0400 Subject: [PATCH 05/10] Fix DebugBootloader: unresolved collectors don't break state populating --- src/Debug/src/State.php | 7 ++- src/Framework/Bootloader/DebugBootloader.php | 45 ++++++++++++------- .../Debug/ScopedDebugBootloaderTest.php | 37 +++++++++++++++ 3 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 tests/Framework/Bootloader/Debug/ScopedDebugBootloaderTest.php diff --git a/src/Debug/src/State.php b/src/Debug/src/State.php index 5c840b102..ffab73b99 100644 --- a/src/Debug/src/State.php +++ b/src/Debug/src/State.php @@ -16,6 +16,9 @@ final class State implements StateInterface private array $extras = []; private array $logEvents = []; + /** + * @param array $tags + */ public function setTags(array $tags): void { $setTags = []; @@ -23,11 +26,11 @@ public function setTags(array $tags): void if (!\is_string($value)) { throw new StateException(\sprintf( 'Invalid tag value, string expected got %s', - get_debug_type($value) + \get_debug_type($value) )); } - $setTags[(string)$key] = $value; + $setTags[$key] = $value; } $this->tags = $setTags; diff --git a/src/Framework/Bootloader/DebugBootloader.php b/src/Framework/Bootloader/DebugBootloader.php index eb36f5f13..1f2a45593 100644 --- a/src/Framework/Bootloader/DebugBootloader.php +++ b/src/Framework/Bootloader/DebugBootloader.php @@ -7,6 +7,7 @@ use Spiral\Boot\Bootloader\Bootloader; use Spiral\Config\ConfiguratorInterface; use Spiral\Config\Patch\Append; +use Spiral\Core\Attribute\Proxy; use Spiral\Core\Attribute\Singleton; use Spiral\Core\Container\Autowire; use Spiral\Core\FactoryInterface; @@ -34,7 +35,6 @@ final class DebugBootloader extends Bootloader ]; public function __construct( - private readonly FactoryInterface $factory, private readonly InvokerInterface $invoker, private readonly ConfiguratorInterface $config, ) { @@ -69,8 +69,10 @@ public function addStateCollector(string|StateCollectorInterface|Autowire $colle /** * Create state and populate it with collectors. */ - private function state(DebugConfig $config): StateInterface - { + private function state( + #[Proxy] FactoryInterface $factory, + DebugConfig $config, + ): StateInterface { $state = new State(); foreach ($config->getTags() as $key => $value) { @@ -79,34 +81,47 @@ private function state(DebugConfig $config): StateInterface } if (!\is_string($value) && !$value instanceof \Stringable) { - throw new StateException(\sprintf( - 'Invalid tag value, `string` expected got `%s`', - \is_object($value) ? $value::class : \gettype($value) - )); + throw new StateException( + \sprintf( + 'Invalid tag value, `string` expected got `%s`', + \is_object($value) ? $value::class : \gettype($value), + ), + ); } - $state->setTag((string) $key, (string) $value); + $state->setTag((string)$key, (string)$value); } + $errors = []; + foreach ($config->getCollectors() as $collector) { - $collector = match (true) { - \is_string($collector) => $this->factory->make($collector), - $collector instanceof Autowire => $collector->resolve($this->factory), - default => $collector, - }; + try { + $collector = match (true) { + \is_string($collector) => $factory->make($collector), + $collector instanceof Autowire => $collector->resolve($factory), + default => $collector, + }; + } catch (\Throwable) { + $errors[] = \is_string($collector) || $collector instanceof \Stringable + ? (string) $collector + : \get_debug_type($collector); + continue; + } if (!$collector instanceof StateCollectorInterface) { throw new StateException( \sprintf( 'Unable to populate state, invalid state collector %s', - \is_object($collector) ? $collector::class : \gettype($collector) - ) + \is_object($collector) ? $collector::class : \gettype($collector), + ), ); } $collector->populate($state); } + $errors === [] or $state->setTags(['unresolved-collectors' => \implode(', ', $errors)]); + return $state; } diff --git a/tests/Framework/Bootloader/Debug/ScopedDebugBootloaderTest.php b/tests/Framework/Bootloader/Debug/ScopedDebugBootloaderTest.php new file mode 100644 index 000000000..97fc6e090 --- /dev/null +++ b/tests/Framework/Bootloader/Debug/ScopedDebugBootloaderTest.php @@ -0,0 +1,37 @@ +createMock(LoaderInterface::class)); + $configs->setDefaults(DebugConfig::CONFIG, ['collectors' => []]); + + $bootloader = $this->getContainer()->get(DebugBootloader::class); + $bootloader->addStateCollector('my-collector'); + $bootloader->addStateCollector('yet-another-collector'); + + $state = $this->getContainer()->get(StateInterface::class); + + self::assertInstanceOf(StateInterface::class, $state); + self::assertSame('my-collector, yet-another-collector', $state->getTags()['unresolved-collectors']); + } +} From f15b63fdd9c35e9a77683d09d09978e3aecf3246 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sat, 21 Sep 2024 00:42:21 +0400 Subject: [PATCH 06/10] Update Log Listener Registry --- src/Bridge/Monolog/tests/ListenersTest.php | 9 +++++++++ src/Logger/src/ListenerRegistry.php | 2 +- src/Logger/src/ListenerRegistryInterface.php | 13 ++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Bridge/Monolog/tests/ListenersTest.php b/src/Bridge/Monolog/tests/ListenersTest.php index a2296995d..6592ccf9c 100644 --- a/src/Bridge/Monolog/tests/ListenersTest.php +++ b/src/Bridge/Monolog/tests/ListenersTest.php @@ -5,6 +5,7 @@ namespace Spiral\Tests\Monolog; use Monolog\Logger; +use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; use PHPUnit\Framework\TestCase; use Psr\Log\LogLevel; use Spiral\Core\Container; @@ -78,4 +79,12 @@ public function testListenError(): void $other->alert('alert', ['context']); $this->assertCount(1, $records); } + + #[DoesNotPerformAssertions] + public function testRemoveNotExistingListener(): void + { + $registry = new ListenerRegistry(); + + $registry->removeListener(static fn (LogEvent $e) => null); + } } diff --git a/src/Logger/src/ListenerRegistry.php b/src/Logger/src/ListenerRegistry.php index 60ff9d677..cac3ca613 100644 --- a/src/Logger/src/ListenerRegistry.php +++ b/src/Logger/src/ListenerRegistry.php @@ -24,7 +24,7 @@ public function addListener(callable $listener): self public function removeListener(callable $listener): void { $key = \array_search($listener, $this->listeners, true); - if ($key !== null) { + if ($key !== false) { unset($this->listeners[$key]); } } diff --git a/src/Logger/src/ListenerRegistryInterface.php b/src/Logger/src/ListenerRegistryInterface.php index 673ee03da..f395bae8d 100644 --- a/src/Logger/src/ListenerRegistryInterface.php +++ b/src/Logger/src/ListenerRegistryInterface.php @@ -4,20 +4,31 @@ namespace Spiral\Logger; +use Spiral\Logger\Event\LogEvent; + +/** + * Registry for log event listeners. + * + * When log event is triggered, all listeners will be executed. + */ interface ListenerRegistryInterface { /** * Add new even listener. + * + * @param callable(LogEvent): void $listener */ public function addListener(callable $listener): self; /** * Add LogEvent listener. + * + * @param callable(LogEvent): void $listener */ public function removeListener(callable $listener): void; /** - * @return callable[] + * @return array */ public function getListeners(): array; } From 0b95afb0352e1b3827aa5a3c645f263ab19d5313 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sat, 21 Sep 2024 00:57:38 +0400 Subject: [PATCH 07/10] Fix psalm issues --- src/Debug/src/StateInterface.php | 3 +++ src/Logger/src/ListenerRegistry.php | 7 +++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Debug/src/StateInterface.php b/src/Debug/src/StateInterface.php index 4094e5be5..1630a633f 100644 --- a/src/Debug/src/StateInterface.php +++ b/src/Debug/src/StateInterface.php @@ -8,6 +8,9 @@ interface StateInterface { + /** + * @param array $tags + */ public function setTags(array $tags): void; public function setTag(string $key, string $value): void; diff --git a/src/Logger/src/ListenerRegistry.php b/src/Logger/src/ListenerRegistry.php index cac3ca613..ff6186968 100644 --- a/src/Logger/src/ListenerRegistry.php +++ b/src/Logger/src/ListenerRegistry.php @@ -4,12 +4,14 @@ namespace Spiral\Logger; +use Spiral\Logger\Event\LogEvent; + /** * Contains all log listeners. */ final class ListenerRegistry implements ListenerRegistryInterface { - /** @var callable[] */ + /** @var array */ private array $listeners = []; public function addListener(callable $listener): self @@ -29,9 +31,6 @@ public function removeListener(callable $listener): void } } - /** - * @return callable[] - */ public function getListeners(): array { return $this->listeners; From c909e020b195d5e14d83c696a6b245a8fb38094e Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sat, 21 Sep 2024 01:02:21 +0400 Subject: [PATCH 08/10] Fix router tests --- src/Router/composer.json | 1 + src/Router/tests/CoreTest.php | 38 ++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/Router/composer.json b/src/Router/composer.json index 95dacefb6..711023f98 100644 --- a/src/Router/composer.json +++ b/src/Router/composer.json @@ -48,6 +48,7 @@ "phpunit/phpunit": "^10.1", "mockery/mockery": "^1.5", "spiral/nyholm-bridge": "^1.3", + "spiral/testing": "^2.8", "vimeo/psalm": "^5.9" }, "autoload": { diff --git a/src/Router/tests/CoreTest.php b/src/Router/tests/CoreTest.php index e31b8c16e..7622a4dce 100644 --- a/src/Router/tests/CoreTest.php +++ b/src/Router/tests/CoreTest.php @@ -4,11 +4,13 @@ namespace Spiral\Tests\Router; +use Spiral\Bootloader\Http\RouterBootloader; use Spiral\Core\Container; use Spiral\Core\CoreInterface; use Spiral\Http\Exception\ClientException\BadRequestException; use Spiral\Http\Exception\ClientException\ForbiddenException; use Spiral\Http\Exception\ClientException\NotFoundException; +use Spiral\Nyholm\Bootloader\NyholmBootloader; use Spiral\Router\CoreHandler; use Spiral\Router\Exception\HandlerException; use Spiral\Router\Exception\TargetException; @@ -16,8 +18,16 @@ use Spiral\Tests\Router\Fixtures\TestController; use Nyholm\Psr7\ServerRequest; -class CoreTest extends BaseTestCase +class CoreTest extends \Spiral\Testing\TestCase { + public function defineBootloaders(): array + { + return [ + RouterBootloader::class, + NyholmBootloader::class, + ]; + } + public function testMissingBinding(): void { $this->expectException(TargetException::class); @@ -31,7 +41,7 @@ public function testMissingBinding(): void public function testAutoCore(): void { $action = new Action(TestController::class, 'test'); - $handler = $action->getHandler($this->container, []); + $handler = $action->getHandler($this->getContainer(), []); $this->assertInstanceOf(CoreHandler::class, $handler); } @@ -40,9 +50,9 @@ public function testWithAutoCore(): void { $action = new Action(TestController::class, 'test'); - $action = $action->withCore(new TestCore($this->container->get(CoreInterface::class))); + $action = $action->withCore(new TestCore($this->getContainer()->get(CoreInterface::class))); - $handler = $action->getHandler($this->container, []); + $handler = $action->getHandler($this->getContainer(), []); $this->assertInstanceOf(CoreHandler::class, $handler); $result = $handler->handle(new ServerRequest('GET', '')); @@ -57,9 +67,9 @@ public function testErrAction(): void $action = new Action(TestController::class, 'err'); - $action = $action->withCore(new TestCore($this->container->get(CoreInterface::class))); + $action = $action->withCore(new TestCore($this->getContainer()->get(CoreInterface::class))); - $handler = $action->getHandler($this->container, []); + $handler = $action->getHandler($this->getContainer(), []); $this->assertInstanceOf(CoreHandler::class, $handler); $handler->handle(new ServerRequest('GET', '')); @@ -69,7 +79,7 @@ public function testRSP(): void { $action = new Action(TestController::class, 'rsp'); - $handler = $action->getHandler($this->container, []); + $handler = $action->getHandler($this->getContainer(), []); $this->assertInstanceOf(CoreHandler::class, $handler); $result = $handler->handle(new ServerRequest('GET', '')); @@ -81,7 +91,7 @@ public function testJson(): void { $action = new Action(TestController::class, 'json'); - $handler = $action->getHandler($this->container, []); + $handler = $action->getHandler($this->getContainer(), []); $this->assertInstanceOf(CoreHandler::class, $handler); $result = $handler->handle(new ServerRequest('GET', '')); @@ -95,7 +105,7 @@ public function testForbidden(): void $this->expectException(ForbiddenException::class); $action = new Action(TestController::class, 'forbidden'); - $action->getHandler($this->container, [])->handle(new ServerRequest('GET', '')); + $action->getHandler($this->getContainer(), [])->handle(new ServerRequest('GET', '')); } public function testNotFound(): void @@ -103,7 +113,7 @@ public function testNotFound(): void $this->expectException(NotFoundException::class); $action = new Action(TestController::class, 'not-found'); - $action->getHandler($this->container, [])->handle(new ServerRequest('GET', '')); + $action->getHandler($this->getContainer(), [])->handle(new ServerRequest('GET', '')); } public function testBadRequest(): void @@ -111,7 +121,7 @@ public function testBadRequest(): void $this->expectException(BadRequestException::class); $action = new Action(TestController::class, 'weird'); - $action->getHandler($this->container, [])->handle(new ServerRequest('GET', '')); + $action->getHandler($this->getContainer(), [])->handle(new ServerRequest('GET', '')); } public function testCoreException(): void @@ -119,18 +129,18 @@ public function testCoreException(): void $this->expectException(HandlerException::class); /** @var CoreHandler $core */ - $core = $this->container->get(CoreHandler::class); + $core = $this->getContainer()->get(CoreHandler::class); $core->handle(new ServerRequest('GET', '')); } public function testRESTFul(): void { $action = new Action(TestController::class, 'Target', Action::RESTFUL); - $r = $action->getHandler($this->container, [])->handle(new ServerRequest('POST', '')); + $r = $action->getHandler($this->getContainer(), [])->handle(new ServerRequest('POST', '')); $this->assertSame('POST', (string)$r->getBody()); - $r = $action->getHandler($this->container, [])->handle(new ServerRequest('DELETE', '')); + $r = $action->getHandler($this->getContainer(), [])->handle(new ServerRequest('DELETE', '')); $this->assertSame('DELETE', (string)$r->getBody()); } From 2b34944c89f822de9abc3de7f3a14cb14915c23e Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Sun, 22 Sep 2024 15:03:14 +0400 Subject: [PATCH 09/10] Fix HandlerInterface factory signature --- src/Framework/Bootloader/Http/RouterBootloader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Framework/Bootloader/Http/RouterBootloader.php b/src/Framework/Bootloader/Http/RouterBootloader.php index 359a913b4..f80939fc2 100644 --- a/src/Framework/Bootloader/Http/RouterBootloader.php +++ b/src/Framework/Bootloader/Http/RouterBootloader.php @@ -107,7 +107,7 @@ private function router( ); } - private function handler(?CoreInterface $core = null, ContainerInterface $container): HandlerInterface + private function handler(?CoreInterface $core, ContainerInterface $container): HandlerInterface { return $core instanceof HandlerInterface ? $core From 85636f72adaccf76cad65e2821c7953c71e0ad79 Mon Sep 17 00:00:00 2001 From: roxblnfk Date: Mon, 23 Sep 2024 11:39:26 +0400 Subject: [PATCH 10/10] Update changelog --- CHANGELOG.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0be2362b9..54d8c70e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,43 @@ # CHANGELOG +## 3.14.4 - 2024-09-23 + +- **Bug Fixes** + - [spiral/router] Router now uses proxied container to create middlewares in a right scope. + - [spiral/router] Better binding for the interceptor handler. + - `DebugBootloader` now uses a Factory Proxy to resolve collectors. + Unresolved collectors don't break state populating flow. + +## 3.14.3 - 2024-09-11 + +- **Bug Fixes** + - [spiral/core] Improved introspecting of Container when a Container Proxy is provided into the `Introspector`. + - [spiral/http] Improved exception message when Input Manager can't get a Request in because of wrong scope. + - `GuardScope` has been deprecated. Use `GuardInterface` directly instead. + +## 3.14.2 - 2024-09-10 + +- **Bug Fixes** + - [spiral/core] Added a proxy recursion detection a dependency on resolving: a `RecursiveProxyException` will be + thrown in this case. + - [spiral/boot] Fixed concurrent writing and reading cached data on workers boot. +- Increased code quality by Rector. + +## 3.14.1 - 2024-09-09 + +- **Bug Fixes** + - [spiral/router] Fixed fallback interceptors handler in `AbstractTarget`. +- Increased code quality by Rector. + +## 3.14.0 - 2024-09-03 + +- **High Impact Changes** + - Scopes + - Deeper integration with Container Scopes: contextual scopes are created inside dispatcher scopes. + - Interceptors + - Added a new package `spiral/interceptors`. + - `spira/hmvc` is deprecated now. + ## 3.13.0 - 2024-05-22 - **Other Features**