Skip to content

Commit 9a4a658

Browse files
author
Renan de Lima
authored
Merge pull request #34 from acsiomatic/routing-condition-service
Tag DeviceDetector as routing condition service
2 parents edc75d7 + d809276 commit 9a4a658

5 files changed

Lines changed: 123 additions & 4 deletions

File tree

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ acsiomatic_device_detector:
6161
# Version truncation behavior, it may assume: major, minor, patch, build, or none
6262
# By default minor versions will be returned (e.g. X.Y)
6363
version_truncation: 'minor'
64+
65+
routing:
66+
67+
# If null, it will not tag DeviceDetector as routing condition service
68+
condition_service_alias: 'device'
6469
```
6570
6671
## Usage in controllers
@@ -94,6 +99,23 @@ The `DeviceDetector` service is assigned to the Twig templates as `device` varia
9499
{% endif %}
95100
```
96101

102+
## Usage in route condition
103+
104+
The `DeviceDetector` is tagged as routing condition service.
105+
106+
```php
107+
use DeviceDetector\DeviceDetector;
108+
109+
class MyController
110+
{
111+
#[Route('/page', condition: "service('device').isSmartphone()")]
112+
public function index()
113+
{
114+
// this endpoint is available only for smartphone devices
115+
}
116+
}
117+
```
118+
97119
## Parsing custom request
98120

99121
You might want to parse other request than the current one.

phpstan.neon.dist

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ parameters:
1717
variable_name: string|null
1818
},
1919
auto_parse: bool,
20-
version_truncation: 'major'|'minor'|'patch'|'build'|'none'
20+
version_truncation: 'major'|'minor'|'patch'|'build'|'none',
21+
routing: array{
22+
condition_service_alias: string|null
23+
}
2124
}
2225
'''
2326
tmpDir: var/phpstan

src/DependencyInjection/AcsiomaticDeviceDetectorExtension.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public function load(array $configs, ContainerBuilder $container): void
6666
$this->setupProxy($container, $config);
6767
$this->setupClientHintsFactory($container, $config);
6868
$this->setupDeviceDetectorFactory($container, $config);
69-
$this->setupDeviceDetector($container);
69+
$this->setupDeviceDetector($container, $config);
7070
$this->setupTwig($container, $config);
7171
}
7272

@@ -127,16 +127,25 @@ private function setupDeviceDetectorFactory(ContainerBuilder $container, array $
127127
]);
128128
}
129129

130-
private function setupDeviceDetector(ContainerBuilder $container): void
130+
/**
131+
* @param BundleConfigArray $config
132+
*/
133+
private function setupDeviceDetector(ContainerBuilder $container, array $config): void
131134
{
132-
$container
135+
$definition = $container
133136
->register(DeviceDetector::class, DeviceDetector::class)
134137
->setPublic(false)
135138
->setFactory([DeviceDetectorFactory::class, 'createDeviceDetectorFromRequestStack'])
136139
->setArguments([
137140
new Reference(DeviceDetectorFactoryInterface::class),
138141
new Reference(RequestStack::class),
139142
]);
143+
144+
if ($config['routing']['condition_service_alias'] !== null) {
145+
$definition->addTag('routing.condition_service', [
146+
'alias' => $config['routing']['condition_service_alias'],
147+
]);
148+
}
140149
}
141150

142151
/**

src/DependencyInjection/Configuration.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ public function getConfigTreeBuilder(): TreeBuilder
5151
->defaultValue('minor')
5252
->end()
5353

54+
->arrayNode('routing')
55+
->addDefaultsIfNotSet()
56+
->children()
57+
->scalarNode('condition_service_alias')->defaultValue('device')->end()
58+
->end()
59+
->end()
60+
5461
->end()
5562
;
5663

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
3+
namespace Acsiomatic\DeviceDetectorBundle\Tests;
4+
5+
use Acsiomatic\DeviceDetectorBundle\AcsiomaticDeviceDetectorBundle;
6+
use Acsiomatic\DeviceDetectorBundle\Tests\Util\Compiler\CallbackContainerPass;
7+
use Acsiomatic\DeviceDetectorBundle\Tests\Util\HttpKernel\Kernel;
8+
use DeviceDetector\DeviceDetector;
9+
use PHPUnit\Framework\TestCase;
10+
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
11+
use Symfony\Component\DependencyInjection\ContainerBuilder;
12+
13+
class RoutingConditionServiceTest extends TestCase
14+
{
15+
public function testDeviceDetectorIsTaggedAsRoutingConditionService(): void
16+
{
17+
$kernel = new Kernel('test', true);
18+
$kernel->appendBundle(new FrameworkBundle());
19+
$kernel->appendBundle(new AcsiomaticDeviceDetectorBundle());
20+
$kernel->appendExtensionConfiguration('framework', ['test' => true, 'secret' => '53CR37']);
21+
$kernel->appendCompilerPass(
22+
new CallbackContainerPass(
23+
static function (ContainerBuilder $containerBuilder): void {
24+
self::assertTrue($containerBuilder->hasDefinition(DeviceDetector::class));
25+
26+
$definition = $containerBuilder->getDefinition(DeviceDetector::class);
27+
28+
self::assertTrue($definition->hasTag('routing.condition_service'));
29+
self::assertSame([['alias' => 'device']], $definition->getTag('routing.condition_service'));
30+
}
31+
)
32+
);
33+
34+
$kernel->boot();
35+
}
36+
37+
public function testHonorCustomAlias(): void
38+
{
39+
$kernel = new Kernel('test', true);
40+
$kernel->appendBundle(new FrameworkBundle());
41+
$kernel->appendBundle(new AcsiomaticDeviceDetectorBundle());
42+
$kernel->appendExtensionConfiguration('framework', ['test' => true, 'secret' => '53CR37']);
43+
$kernel->appendExtensionConfiguration('acsiomatic_device_detector', ['routing' => ['condition_service_alias' => 'custom']]);
44+
$kernel->appendCompilerPass(
45+
new CallbackContainerPass(
46+
static function (ContainerBuilder $containerBuilder): void {
47+
self::assertTrue($containerBuilder->hasDefinition(DeviceDetector::class));
48+
49+
$definition = $containerBuilder->getDefinition(DeviceDetector::class);
50+
51+
self::assertTrue($definition->hasTag('routing.condition_service'));
52+
self::assertSame([['alias' => 'custom']], $definition->getTag('routing.condition_service'));
53+
}
54+
)
55+
);
56+
57+
$kernel->boot();
58+
}
59+
60+
public function testDisabling(): void
61+
{
62+
$kernel = new Kernel('test', true);
63+
$kernel->appendBundle(new FrameworkBundle());
64+
$kernel->appendBundle(new AcsiomaticDeviceDetectorBundle());
65+
$kernel->appendExtensionConfiguration('framework', ['test' => true, 'secret' => '53CR37']);
66+
$kernel->appendExtensionConfiguration('acsiomatic_device_detector', ['routing' => ['condition_service_alias' => null]]);
67+
$kernel->appendCompilerPass(
68+
new CallbackContainerPass(
69+
static function (ContainerBuilder $containerBuilder): void {
70+
self::assertTrue($containerBuilder->hasDefinition(DeviceDetector::class));
71+
self::assertFalse($containerBuilder->getDefinition(DeviceDetector::class)->hasTag('routing.condition_service'));
72+
}
73+
)
74+
);
75+
76+
$kernel->boot();
77+
}
78+
}

0 commit comments

Comments
 (0)