diff --git a/src/Bootstrappers/RegisterRequestHandler.php b/src/Bootstrappers/RegisterRequestHandler.php index 64d1419..9a187db 100644 --- a/src/Bootstrappers/RegisterRequestHandler.php +++ b/src/Bootstrappers/RegisterRequestHandler.php @@ -3,6 +3,10 @@ namespace Rareloop\Lumberjack\Bootstrappers; use Rareloop\Lumberjack\Application; +use Rareloop\Lumberjack\Http\ServerRequest; +use Laminas\Diactoros\ServerRequestFactory; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ServerRequestInterface; class RegisterRequestHandler { @@ -14,6 +18,21 @@ public function bootstrap(Application $app) $app->detectWhenRequestHasNotBeenHandled(); } + if (!$app->has('request')) { + $request = ServerRequest::fromRequest(ServerRequestFactory::fromGlobals( + $_SERVER, + $_GET, + $_POST, + $_COOKIE, + $_FILES + )); + + $app->bind('request', $request); + $app->bind(RequestInterface::class, $request); + $app->bind(ServerRequestInterface::class, $request); + $app->bind(ServerRequest::class, $request); + } + $app->bind(\WP_Query::class, function () { return $GLOBALS['wp_query']; }); diff --git a/src/Providers/RouterServiceProvider.php b/src/Providers/RouterServiceProvider.php index 6e1f09f..14b5ac7 100644 --- a/src/Providers/RouterServiceProvider.php +++ b/src/Providers/RouterServiceProvider.php @@ -3,6 +3,7 @@ namespace Rareloop\Lumberjack\Providers; use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ServerRequestInterface; use Rareloop\Lumberjack\Contracts\MiddlewareAliases; use Rareloop\Lumberjack\Http\MiddlewareAliasStore; use Rareloop\Lumberjack\Http\MiddlewareResolver; @@ -66,6 +67,15 @@ private function getBasePathFromWPConfig() public function processRequest(RequestInterface $request) { $this->app->bind('request', $request); + $this->app->bind(RequestInterface::class, $request); + + if ($request instanceof ServerRequestInterface) { + $this->app->bind(ServerRequestInterface::class, $request); + } + + if ($request instanceof ServerRequest) { + $this->app->bind(ServerRequest::class, $request); + } $response = $this->app->get('router')->match($request); diff --git a/src/Providers/WordPressControllersServiceProvider.php b/src/Providers/WordPressControllersServiceProvider.php index 6473737..976429a 100644 --- a/src/Providers/WordPressControllersServiceProvider.php +++ b/src/Providers/WordPressControllersServiceProvider.php @@ -8,6 +8,8 @@ use mindplay\middleman\Dispatcher; use Rareloop\Router\ResponseFactory; use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ServerRequestInterface; +use Rareloop\Lumberjack\Http\ServerRequest; use Rareloop\Lumberjack\Http\Middleware\PasswordProtected; use Laminas\Diactoros\ServerRequestFactory; use Rareloop\Router\ProvidesControllerMiddleware; @@ -90,6 +92,17 @@ public function handleRequest(RequestInterface $request, $controllerName, $metho $this->app->requestHasBeenHandled(); + $this->app->bind('request', $request); + $this->app->bind(RequestInterface::class, $request); + + if ($request instanceof ServerRequestInterface) { + $this->app->bind(ServerRequestInterface::class, $request); + } + + if ($request instanceof ServerRequest) { + $this->app->bind(ServerRequest::class, $request); + } + $controller = $this->app->get($controllerName); $middlewares = []; diff --git a/tests/Unit/Providers/RouterServiceProviderTest.php b/tests/Unit/Providers/RouterServiceProviderTest.php index 9c52cac..ffd9651 100644 --- a/tests/Unit/Providers/RouterServiceProviderTest.php +++ b/tests/Unit/Providers/RouterServiceProviderTest.php @@ -9,6 +9,7 @@ use Rareloop\Lumberjack\Test\TestCase; use PHPUnit\Framework\Attributes\Test; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; @@ -16,6 +17,7 @@ use Rareloop\Lumberjack\Contracts\MiddlewareAliases; use Rareloop\Lumberjack\Http\Lumberjack; use Rareloop\Lumberjack\Http\Router; +use Rareloop\Lumberjack\Http\ServerRequest as LumberjackServerRequest; use Rareloop\Lumberjack\Providers\RouterServiceProvider; use Rareloop\Lumberjack\Test\Unit\Concerns\BrainMonkeyPHPUnitIntegration; use Rareloop\Router\MiddlewareResolver; @@ -136,7 +138,7 @@ public function request_object_is_bound_into_the_container(): void Functions\expect('is_admin')->once()->andReturn(false); $this->setSiteUrl('http://example.com/sub-path/'); - $request = new ServerRequest([], [], '/sub-path/test/123', 'GET'); + $request = new LumberjackServerRequest([], [], '/sub-path/test/123', 'GET'); $app = new Application(__DIR__ . '/../'); $lumberjack = new Lumberjack($app); $provider = new RouterServiceProvider($app); @@ -147,6 +149,9 @@ public function request_object_is_bound_into_the_container(): void $provider->processRequest($request); $this->assertSame($request, $app->get('request')); + $this->assertSame($request, $app->get(RequestInterface::class)); + $this->assertSame($request, $app->get(ServerRequestInterface::class)); + $this->assertSame($request, $app->get(LumberjackServerRequest::class)); } #[Test] diff --git a/tests/Unit/Providers/WordPressControllersServiceProviderTest.php b/tests/Unit/Providers/WordPressControllersServiceProviderTest.php index 265ac4e..9f3cef7 100644 --- a/tests/Unit/Providers/WordPressControllersServiceProviderTest.php +++ b/tests/Unit/Providers/WordPressControllersServiceProviderTest.php @@ -19,6 +19,7 @@ use Rareloop\Lumberjack\Http\Kernal; use Rareloop\Lumberjack\Http\MiddlewareAliasStore; use Rareloop\Lumberjack\Http\MiddlewareResolver; +use Rareloop\Lumberjack\Http\ServerRequest as LumberjackServerRequest; use Rareloop\Lumberjack\Providers\RouterServiceProvider; use Rareloop\Lumberjack\Providers\WordPressControllersServiceProvider; use Rareloop\Lumberjack\Test\Unit\Concerns\BrainMonkeyPHPUnitIntegration; @@ -399,6 +400,48 @@ public function handle_template_include_will_not_call_app_shutdown_when_it_has_n $provider->handleTemplateInclude(__DIR__ . '/includes/single.php'); } + + #[Test] + public function request_object_is_bound_into_container_when_handling_request(): void + { + Functions\expect('post_password_required') + ->once() + ->andReturn(false); + + $app = new Application(__DIR__ . '/../'); + + $provider = new WordPressControllersServiceProvider($app); + $provider->boot(); + + $request = new LumberjackServerRequest([], [], '/sub-path/test/123', 'GET'); + + $provider->handleRequest($request, TestController::class, 'handle'); + + $this->assertSame($request, $app->get('request')); + $this->assertSame($request, $app->get(RequestInterface::class)); + $this->assertSame($request, $app->get(ServerRequestInterface::class)); + $this->assertSame($request, $app->get(LumberjackServerRequest::class)); + } + + #[Test] + public function handle_request_resolves_server_request_interface_from_container_in_constructor(): void + { + Functions\expect('post_password_required') + ->once() + ->andReturn(false); + + $app = new Application(__DIR__ . '/../'); + + $provider = new WordPressControllersServiceProvider($app); + $provider->boot(); + + $request = new LumberjackServerRequest([], [], '/sub-path/test/123', 'GET'); + + $provider->handleRequest($request, TestControllerWithServerRequestConstructorParams::class, 'handle'); + + $controller = $app->get(TestControllerWithServerRequestConstructorParams::class); + $this->assertSame($request, $controller->request); + } } class TestController @@ -462,3 +505,17 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response->withHeader($this->key, $this->value); } } + +class TestControllerWithServerRequestConstructorParams +{ + public $request; + + public function __construct(ServerRequestInterface $request) + { + $this->request = $request; + } + + public function handle() + { + } +}