feat: allow to url_encode array in polling url

This commit is contained in:
Benjamin Nussbaum 2025-09-02 14:33:54 +02:00
parent aa8d3d1428
commit 40ceba267a
3 changed files with 52 additions and 0 deletions

View file

@ -0,0 +1,20 @@
<?php
namespace App\Liquid\Filters;
class StandardFilters extends \Keepsuit\Liquid\Filters\StandardFilters
{
/**
* Converts any URL-unsafe characters in a string to the
* [percent-encoded](https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding) equivalent.
*/
public function urlEncode(string|int|float|array|null $input): string
{
if (is_array($input)) {
$input = json_encode($input);
}
return parent::urlEncode($input);
}
}

View file

@ -7,6 +7,7 @@ use App\Liquid\Filters\Data;
use App\Liquid\Filters\Date; use App\Liquid\Filters\Date;
use App\Liquid\Filters\Localization; use App\Liquid\Filters\Localization;
use App\Liquid\Filters\Numbers; use App\Liquid\Filters\Numbers;
use App\Liquid\Filters\StandardFilters;
use App\Liquid\Filters\StringMarkup; use App\Liquid\Filters\StringMarkup;
use App\Liquid\Filters\Uniqueness; use App\Liquid\Filters\Uniqueness;
use App\Liquid\Tags\TemplateTag; use App\Liquid\Tags\TemplateTag;
@ -265,6 +266,7 @@ class Plugin extends Model
// Use the Liquid template engine to resolve variables // Use the Liquid template engine to resolve variables
$environment = App::make('liquid.environment'); $environment = App::make('liquid.environment');
$environment->filterRegistry->register(StandardFilters::class);
$liquidTemplate = $environment->parseString($template); $liquidTemplate = $environment->parseString($template);
$context = $environment->newRenderContext(data: $variables); $context = $environment->newRenderContext(data: $variables);

View file

@ -2,7 +2,9 @@
declare(strict_types=1); declare(strict_types=1);
use App\Liquid\Filters\StandardFilters;
use App\Models\Plugin; use App\Models\Plugin;
use Keepsuit\Liquid\Environment;
/** /**
* Tests for the Liquid where filter functionality * Tests for the Liquid where filter functionality
@ -92,3 +94,31 @@ LIQUID
// Should not contain the low tide data // Should not contain the low tide data
$this->assertStringNotContainsString('"type":"L"', $result); $this->assertStringNotContainsString('"type":"L"', $result);
}); });
it('encodes arrays for url_encode as JSON with spaces after commas and then percent-encodes', function () {
/** @var Environment $env */
$env = app('liquid.environment');
$env->filterRegistry->register(StandardFilters::class);
$template = $env->parseString('{{ categories | url_encode }}');
$output = $template->render($env->newRenderContext([
'categories' => ['common', 'obscure'],
]));
expect($output)->toBe('%5B%22common%22%2C%22obscure%22%5D');
});
it('keeps scalar url_encode behavior intact', function () {
/** @var Environment $env */
$env = app('liquid.environment');
$env->filterRegistry->register(StandardFilters::class);
$template = $env->parseString('{{ text | url_encode }}');
$output = $template->render($env->newRenderContext([
'text' => 'hello world',
]));
expect($output)->toBe('hello+world');
});