Skip to content

Commit

Permalink
Merge pull request #78 from heimrichhannot/feature/allow-multiple-que…
Browse files Browse the repository at this point in the history
…ry-params

add support for multiple query parameters tu UrlUtil
  • Loading branch information
ericges committed Mar 13, 2024
2 parents 9445ecb + a950da7 commit 94bc123
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 17 deletions.
60 changes: 43 additions & 17 deletions src/Util/UrlUtil.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php

/*
* Copyright (c) 2023 Heimrich & Hannot GmbH
* Copyright (c) 2024 Heimrich & Hannot GmbH
*
* @license LGPL-3.0-or-later
*/
Expand All @@ -13,19 +13,22 @@

class UrlUtil
{

public function __construct(private RequestStack $requestStack)
{
}
public function __construct(private RequestStack $requestStack) {}

/**
* Remove a query parameter (GET parameter) from an url.
* If no url is given, the method tries to get the current url from the request.
* Remove query parameters (GET parameter) from a URL.
* You can pass a string or an associative array to $parameter.
* If no URL is given, the current request url is used.
*
* @example removeQueryStringParameterFromUrl('foo', 'https://example.com?foo=bar&baz=fuzz') // https://example.com?baz=fuzz
* @example removeQueryStringParameterFromUrl(['foo', 'baz'], 'https://example.com?foo=bar&baz=fuzz') // https://example.com
*
* @param string $parameter The query parameter name to remove
* @param string $url the url where the query parameter should be removed
* @param string|array<string> $parameter The query parameter names to remove.
* @param string $url The URL to rid of the given query parameters.
*
* @return string The URL without the given query parameters.
*/
public function removeQueryStringParameterFromUrl(string $parameter, string $url = ''): string
public function removeQueryStringParameterFromUrl(string|array $parameter, string $url = ''): string
{
if (empty($url)) {
$request = $this->requestStack->getCurrentRequest();
Expand All @@ -39,9 +42,18 @@ public function removeQueryStringParameterFromUrl(string $parameter, string $url
$parsedUrl = parse_url($url);
$query = [];

if (isset($parsedUrl['query'])) {
if (isset($parsedUrl['query']))
{
parse_str($parsedUrl['query'], $query);
unset($query[$parameter]);

if (is_string($parameter))
{
unset($query[$parameter]);
}
else foreach ($parameter as $param)
{
unset($query[$param]);
}
}

$parsedUrl['query'] = !empty($query) ? http_build_query($query) : '';
Expand All @@ -50,10 +62,19 @@ public function removeQueryStringParameterFromUrl(string $parameter, string $url
}

/**
* Add a query string parameter to an url.
* If no url is given, the current request url is used.
* Add a query string parameter to a URL.
* You can pass a string or an associative array to $parameter.
* If no url is given, the current request URL is used.
*
* @example addQueryStringParameterToUrl('foo=bar', 'https://example.com') // https://example.com?foo=bar
* @example addQueryStringParameterToUrl(['foo' => 'bar'], 'https://example.com') // https://example.com?foo=bar
*
* @param string|array<string, string> $parameter The query parameters to add.
* @param string $url The URL to which query parameter should be added.
*
* @return string The concatenated URL.
*/
public function addQueryStringParameterToUrl(string $parameter, string $url = ''): string
public function addQueryStringParameterToUrl(string|array $parameter, string $url = ''): string
{
if (empty($url)) {
$request = $this->requestStack->getCurrentRequest();
Expand All @@ -72,8 +93,13 @@ public function addQueryStringParameterToUrl(string $parameter, string $url = ''
parse_str($parsedUrl['query'], $pairs);
}

$newPairs = [];
parse_str(str_replace('&amp;', '&', $parameter), $newPairs);
if (is_string($parameter)) {
$newPairs = [];
parse_str(str_replace('&amp;', '&', $parameter), $newPairs);
} else {
$newPairs = $parameter;
}

$pairs = array_merge($pairs, $newPairs);

$parsedUrl['query'] = (!empty($pairs) ? http_build_query($pairs) : '');
Expand Down
47 changes: 47 additions & 0 deletions tests/Util/UrlUtilTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Util;

use Contao\TestCase\ContaoTestCase;
use HeimrichHannot\UtilsBundle\Util\UrlUtil;

class UrlUtilTest extends ContaoTestCase
{
public function getTestInstance(array $parameters = []): UrlUtil
{
if (!isset($parameters['requestStack']))
{
$parameters['requestStack'] = $this->createMock('Symfony\Component\HttpFoundation\RequestStack');
}

return new UrlUtil($parameters['requestStack']);
}

public function testAddQueryStringParameterToUrl()
{
$url = 'https://example.com';
$instance = $this->getTestInstance();

$this->assertSame($instance->addQueryStringParameterToUrl('foo=bar', $url), $url . '?foo=bar');
$this->assertSame($instance->addQueryStringParameterToUrl('foo=bar', $url . '?foo=baz'), $url . '?foo=bar');
$this->assertSame($instance->addQueryStringParameterToUrl('foo=bar', $url . '?baz=fuzz'), $url . '?baz=fuzz&foo=bar');

$this->assertSame($instance->addQueryStringParameterToUrl(['foo' => 'bar'], $url), $url . '?foo=bar');
$this->assertSame($instance->addQueryStringParameterToUrl(['foo' => 'bar'], $url . '?foo=baz'), $url . '?foo=bar');
$this->assertSame($instance->addQueryStringParameterToUrl(['foo' => 'bar', 'spam' => 'ham'], $url . '?foo=baz'), $url . '?foo=bar&spam=ham');
}

public function testRemoveQueryStringParameterFromUrl()
{
$url = 'https://example.com';
$urlW = $url . '?foo=bar&spam=ham&eggs=baz';
$instance = $this->getTestInstance();

$this->assertSame($instance->removeQueryStringParameterFromUrl('foo', $urlW), $url . '?spam=ham&eggs=baz');
$this->assertSame($instance->removeQueryStringParameterFromUrl('spam', $urlW), $url . '?foo=bar&eggs=baz');

$this->assertSame($instance->removeQueryStringParameterFromUrl(['foo'], $urlW), $url . '?spam=ham&eggs=baz');
$this->assertSame($instance->removeQueryStringParameterFromUrl(['spam'], $urlW), $url . '?foo=bar&eggs=baz');
$this->assertSame($instance->removeQueryStringParameterFromUrl(['foo', 'spam'], $urlW), $url . '?eggs=baz');
}
}

0 comments on commit 94bc123

Please sign in to comment.