diff --git a/ArgumentValueResolver/PsrServerRequestResolver.php b/ArgumentValueResolver/PsrServerRequestResolver.php index 29dc7dc..61cd8c5 100644 --- a/ArgumentValueResolver/PsrServerRequestResolver.php +++ b/ArgumentValueResolver/PsrServerRequestResolver.php @@ -17,6 +17,7 @@ use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; +use Symfony\Component\HttpKernel\Controller\ValueResolverInterface as BaseValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; /** @@ -25,7 +26,7 @@ * @author Iltar van der Berg * @author Alexander M. Turek */ -final class PsrServerRequestResolver implements ArgumentValueResolverInterface +final class PsrServerRequestResolver implements ArgumentValueResolverInterface, ValueResolverInterface { private const SUPPORTED_TYPES = [ ServerRequestInterface::class => true, @@ -45,6 +46,10 @@ public function __construct(HttpMessageFactoryInterface $httpMessageFactory) */ public function supports(Request $request, ArgumentMetadata $argument): bool { + if ($this instanceof BaseValueResolverInterface) { + trigger_deprecation('symfony/psr-http-message-bridge', '2.3', 'Method "%s" is deprecated, call "resolve()" without calling "supports()" first.', __METHOD__); + } + return self::SUPPORTED_TYPES[$argument->getType()] ?? false; } @@ -53,6 +58,10 @@ public function supports(Request $request, ArgumentMetadata $argument): bool */ public function resolve(Request $request, ArgumentMetadata $argument): \Traversable { + if (!isset(self::SUPPORTED_TYPES[$argument->getType()])) { + return; + } + yield $this->httpMessageFactory->createRequest($request); } } diff --git a/ArgumentValueResolver/ValueResolverInterface.php b/ArgumentValueResolver/ValueResolverInterface.php new file mode 100644 index 0000000..83a321a --- /dev/null +++ b/ArgumentValueResolver/ValueResolverInterface.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\PsrHttpMessage\ArgumentValueResolver; + +use Symfony\Component\HttpKernel\Controller\ValueResolverInterface as BaseValueResolverInterface; + +if (interface_exists(BaseValueResolverInterface::class)) { + /** @internal */ + interface ValueResolverInterface extends BaseValueResolverInterface + { + } +} else { + /** @internal */ + interface ValueResolverInterface + { + } +} diff --git a/Tests/ArgumentValueResolver/PsrServerRequestResolverTest.php b/Tests/ArgumentValueResolver/PsrServerRequestResolverTest.php index 662b186..3ff2871 100644 --- a/Tests/ArgumentValueResolver/PsrServerRequestResolverTest.php +++ b/Tests/ArgumentValueResolver/PsrServerRequestResolverTest.php @@ -15,16 +15,21 @@ use Psr\Http\Message\MessageInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Bridge\PsrHttpMessage\ArgumentValueResolver\PsrServerRequestResolver; use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; +use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; +use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; /** * @author Alexander M. Turek */ final class PsrServerRequestResolverTest extends TestCase { + use ExpectDeprecationTrait; + public function testServerRequest() { $symfonyRequest = $this->createMock(Request::class); @@ -55,6 +60,21 @@ public function testMessage() self::assertSame([$psrRequest], $resolver->getArguments($symfonyRequest, static function (MessageInterface $request): void {})); } + /** + * @group legacy + */ + public function testDeprecatedSupports() + { + if (!interface_exists(ValueResolverInterface::class)) { + $this->markTestSkipped('Requires symfony/http-kernel 6.2.'); + } + + $resolver = new PsrServerRequestResolver($this->createStub(HttpMessageFactoryInterface::class)); + + $this->expectDeprecation('Since symfony/psr-http-message-bridge 2.3: Method "Symfony\Bridge\PsrHttpMessage\ArgumentValueResolver\PsrServerRequestResolver::supports" is deprecated, call "resolve()" without calling "supports()" first.'); + $resolver->supports($this->createStub(Request::class), $this->createStub(ArgumentMetadata::class)); + } + private function bootstrapResolver(Request $symfonyRequest, ServerRequestInterface $psrRequest): ArgumentResolver { $messageFactory = $this->createMock(HttpMessageFactoryInterface::class); diff --git a/composer.json b/composer.json index e08b15c..b705eb2 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "require": { "php": ">=7.2.5", "psr/http-message": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0", "symfony/http-foundation": "^5.4 || ^6.0" }, "require-dev": { @@ -41,7 +42,7 @@ }, "extra": { "branch-alias": { - "dev-main": "2.2-dev" + "dev-main": "2.3-dev" } } }