From 04a026c2e761cc7beb2760b518946e406aa1a845 Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Mon, 3 Nov 2025 15:14:20 +0000 Subject: [PATCH 1/2] feature: set status code mutably for #228 --- src/Response.php | 12 ++++++++++++ test/phpunit/ResponseTest.php | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/Response.php b/src/Response.php index 32fe744..201b925 100644 --- a/src/Response.php +++ b/src/Response.php @@ -104,6 +104,14 @@ public function setExitCallback(callable $callback):void { $this->exitCallback = $callback; } + public function abort(?int $statusCode = null):void { + if($statusCode) { + $this->setStatus($statusCode); + } + + call_user_func($this->exitCallback); + } + public function reload():void { $this->redirect($this->request?->getUri() ?? new Uri("./")); } @@ -164,6 +172,10 @@ public function withStatus( return $clone; } + public function setStatus(int $code):void { + $this->statusCode = $code; + } + /** @inheritDoc */ public function getReasonPhrase():string { return StatusCode::REASON_PHRASE[$this->statusCode]; diff --git a/test/phpunit/ResponseTest.php b/test/phpunit/ResponseTest.php index 506b6ee..46e4f61 100644 --- a/test/phpunit/ResponseTest.php +++ b/test/phpunit/ResponseTest.php @@ -29,6 +29,12 @@ public function testWithStatusCode() { ); } + public function testSetStatus() { + $sut = new Response(123); + $sut->setStatus(321); + self::assertSame(321, $sut->getStatusCode()); + } + public function testGetReasonPhraseDefault() { $notFound = new Response(404); self::assertEquals("Not Found", $notFound->getReasonPhrase()); From 993d2ea4dce20e82350838f26caba8e863dcd05f Mon Sep 17 00:00:00 2001 From: Greg Bowler Date: Mon, 3 Nov 2025 15:16:54 +0000 Subject: [PATCH 2/2] feature: abort closes #228 --- test/phpunit/ResponseTest.php | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/test/phpunit/ResponseTest.php b/test/phpunit/ResponseTest.php index 46e4f61..fc7e12f 100644 --- a/test/phpunit/ResponseTest.php +++ b/test/phpunit/ResponseTest.php @@ -35,6 +35,31 @@ public function testSetStatus() { self::assertSame(321, $sut->getStatusCode()); } + public function testAbort() { + $called = false; + $exitCallback = function()use(&$called) { + $called = true; + }; + + $sut = new Response(); + $sut->setExitCallback($exitCallback); + $sut->abort(); + self::assertTrue($called); + } + + public function testAbort_withNewStatus() { + $called = false; + $exitCallback = function()use(&$called) { + $called = true; + }; + + $sut = new Response(500); + $sut->setExitCallback($exitCallback); + $sut->abort(503); + self::assertTrue($called); + self::assertSame(503, $sut->getStatusCode()); + } + public function testGetReasonPhraseDefault() { $notFound = new Response(404); self::assertEquals("Not Found", $notFound->getReasonPhrase());