From 5e4c9bda795f8b11e5e6a5598f0df5953e160f6d Mon Sep 17 00:00:00 2001 From: Rapolas Date: Thu, 3 Feb 2022 10:33:16 +0100 Subject: [PATCH] Add ability to set multiple query parameters at once --- README.md | 1 + src/Url.php | 9 +++++++++ tests/UrlQueryParametersTest.php | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/README.md b/README.md index b768395..3dfa31c 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ $url = Url::fromString('https://spatie.be/opensource?utm_source=github&utm_campa echo $url->getQuery(); // 'utm_source=github&utm_campaign=packages' echo $url->getQueryParameter('utm_source'); // 'github' echo $url->withoutQueryParameter('utm_campaign'); // 'https://spatie.be/opensource?utm_source=github' +echo $url->withQueryParameters(['utm_campaign' => 'packages']); // 'https://spatie.be/opensource?utm_source=github&utm_campaign=packages' ``` Retrieve path segments: diff --git a/src/Url.php b/src/Url.php index cc0e78d..0b8cbd8 100644 --- a/src/Url.php +++ b/src/Url.php @@ -148,6 +148,15 @@ public function withQueryParameter(string $key, string $value): static return $url; } + public function withQueryParameters(array $parameters): static + { + $parameters = array_merge($this->getAllQueryParameters(), $parameters); + $url = clone $this; + $url->query = new QueryParameterBag($parameters); + + return $url; + } + public function withoutQueryParameter(string $key): static { $url = clone $this; diff --git a/tests/UrlQueryParametersTest.php b/tests/UrlQueryParametersTest.php index a552aea..4e40824 100644 --- a/tests/UrlQueryParametersTest.php +++ b/tests/UrlQueryParametersTest.php @@ -47,6 +47,24 @@ public function it_can_set_a_query_parameter() $this->assertSame('10', $url->getQueryParameter('offset')); } + /** @test */ + public function it_can_set_multiple_query_parameters() + { + $url = Url::create()->withQueryParameters(['offset' => 10, 'limit' => 5]); + + $this->assertEquals('10', $url->getQueryParameter('offset')); + $this->assertEquals('5', $url->getQueryParameter('limit')); + } + + /** @test */ + public function it_merges_multiple_query_parameters() + { + $url = Url::create()->withQuery('offset=10')->withQueryParameters(['limit' => 5]); + + $this->assertTrue($url->hasQueryParameter('offset')); + $this->assertTrue($url->hasQueryParameter('limit')); + } + /** @test */ public function it_can_check_if_it_has_a_query_parameter() {