Skip to content

Commit 8a15f46

Browse files
committed
Make the configuration better DX wise
1 parent 74c196c commit 8a15f46

File tree

2 files changed

+28
-77
lines changed

2 files changed

+28
-77
lines changed

src/DependencyInjection/SetonoSyliusConversionAttributionExtension.php

Lines changed: 28 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
1010
use Symfony\Component\Config\FileLocator;
1111
use Symfony\Component\DependencyInjection\ContainerBuilder;
12+
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
1213
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
1314
use Symfony\Component\HttpKernel\Bundle\BundleInterface;
1415

15-
final class SetonoSyliusConversionAttributionExtension extends AbstractResourceExtension
16+
final class SetonoSyliusConversionAttributionExtension extends AbstractResourceExtension implements PrependExtensionInterface
1617
{
1718
public function load(array $configs, ContainerBuilder $container): void
1819
{
@@ -29,48 +30,10 @@ public function load(array $configs, ContainerBuilder $container): void
2930
$config = $this->processConfiguration($this->getConfiguration([], $container), $configs);
3031
$loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
3132

32-
$queryParameters = array_merge_recursive([
33-
'facebook' => [
34-
'matches' => ['fbclid'], 'source' => 'facebook.com', 'medium' => 'cpc',
35-
],
36-
'google' => [
37-
'matches' => ['gclid', 'gbraid', 'wbraid'], 'source' => 'google', 'medium' => 'cpc',
38-
],
39-
'microsoft' => [
40-
'matches' => ['msclkid'], 'source' => 'bing', 'medium' => 'cpc',
41-
],
42-
'generic' => [
43-
'matches' => ['source', 'ref'],
44-
],
45-
'tiktok' => [
46-
'matches' => ['ttclid'], 'source' => 'tiktok', 'medium' => 'cpc',
47-
],
48-
'x' => [
49-
'matches' => ['twclid'], 'source' => 'x', 'medium' => 'cpc',
50-
],
51-
], $config['query_parameters']);
52-
$queryParameters = array_filter($queryParameters, static function (array $queryParameter): bool {
53-
return !array_key_exists('enabled', $queryParameter) || true === $queryParameter['enabled'];
54-
});
55-
$queryParameters = array_map(
56-
/** @param array{matches: list<string>, source?: list<string|null>|string|null, medium?: list<string|null>|string|null, campaign?: list<string|null>|string|null, enabled?: bool} $queryParameter */
57-
static function (array $queryParameter): array {
58-
unset($queryParameter['enabled']);
59-
60-
$queryParameter['matches'] = array_values(array_unique($queryParameter['matches']));
61-
62-
// Because array_merge_recursive will merge associative keys by creating a new array, we will turn it back into a string
63-
$queryParameter['source'] = self::firstValue($queryParameter['source'] ?? null);
64-
$queryParameter['medium'] = self::firstValue($queryParameter['medium'] ?? null);
65-
$queryParameter['campaign'] = self::firstValue($queryParameter['campaign'] ?? null);
66-
67-
return $queryParameter;
68-
},
69-
$queryParameters,
70-
);
71-
7233
$container->setParameter('setono_sylius_conversion_attribution.javascript.enabled', $config['javascript']['enabled']);
73-
$container->setParameter('setono_sylius_conversion_attribution.query_parameters', $queryParameters);
34+
$container->setParameter('setono_sylius_conversion_attribution.query_parameters', array_filter($config['query_parameters'], static function (array $queryParameter): bool {
35+
return !array_key_exists('enabled', $queryParameter) || true === $queryParameter['enabled'];
36+
}));
7437
$container->setParameter('setono_sylius_conversion_attribution.session_timeout', $config['session_timeout']);
7538
$container->setParameter('setono_sylius_conversion_attribution.referrers.cache.file', '%kernel.cache_dir%/referrers.php');
7639

@@ -114,18 +77,29 @@ private static function bundleEnabled(ContainerBuilder $container, string $bundl
11477
return isset($bundles[$bundle->getName()]);
11578
}
11679

117-
/**
118-
* @param string|list<string|null>|null $value
119-
*/
120-
private static function firstValue(null|string|array $value): ?string
80+
public function prepend(ContainerBuilder $container): void
12181
{
122-
$array = (array) $value;
123-
foreach ($array as $item) {
124-
if (null !== $item) {
125-
return $item;
126-
}
127-
}
128-
129-
return null;
82+
$container->prependExtensionConfig('setono_sylius_conversion_attribution', [
83+
'query_parameters' => [
84+
'facebook' => [
85+
'matches' => ['fbclid'], 'source' => 'facebook.com', 'medium' => 'cpc',
86+
],
87+
'google' => [
88+
'matches' => ['gclid', 'gbraid', 'wbraid'], 'source' => 'google', 'medium' => 'cpc',
89+
],
90+
'microsoft' => [
91+
'matches' => ['msclkid'], 'source' => 'bing', 'medium' => 'cpc',
92+
],
93+
'generic' => [
94+
'matches' => ['source', 'ref'],
95+
],
96+
'tiktok' => [
97+
'matches' => ['ttclid'], 'source' => 'tiktok', 'medium' => 'cpc',
98+
],
99+
'x' => [
100+
'matches' => ['twclid'], 'source' => 'x', 'medium' => 'cpc',
101+
],
102+
],
103+
]);
130104
}
131105
}

tests/DependencyInjection/SetonoSyliusConversionAttributionExtensionTest.php

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,6 @@ protected function getContainerExtensions(): array
1717
];
1818
}
1919

20-
/**
21-
* @test
22-
*/
23-
public function it_sets_cpc_parameters(): void
24-
{
25-
$this->load([
26-
'javascript' => false,
27-
'query_parameters' => [
28-
'facebook' => ['enabled' => false], // should exclude facebook from the resolved list
29-
'generic' => ['matches' => ['ref']], // 'ref' should only occur once on the resolved list
30-
'x' => ['matches' => ['xclid']], // should add 'xclid' to the list
31-
],
32-
]);
33-
34-
$this->assertContainerBuilderHasParameter('setono_sylius_conversion_attribution.query_parameters', [
35-
'google' => ['matches' => ['gclid', 'gbraid', 'wbraid'], 'source' => 'google', 'medium' => 'cpc', 'campaign' => null],
36-
'microsoft' => ['matches' => ['msclkid'], 'source' => 'bing', 'medium' => 'cpc', 'campaign' => null],
37-
'generic' => ['matches' => ['source', 'ref'], 'source' => null, 'medium' => null, 'campaign' => null],
38-
'tiktok' => ['matches' => ['ttclid'], 'source' => 'tiktok', 'medium' => 'cpc', 'campaign' => null],
39-
'x' => ['matches' => ['twclid', 'xclid'], 'source' => 'x', 'medium' => 'cpc', 'campaign' => null],
40-
]);
41-
}
42-
4320
/**
4421
* @test
4522
*/

0 commit comments

Comments
 (0)