Skip to content

Commit f2c4224

Browse files
authored
Merge pull request #8 from iter8-au/feature-symfony-6-support
[FEATURE] Symfony 6 Support
2 parents ec620b1 + 2c44e03 commit f2c4224

14 files changed

+273
-77
lines changed

.github/workflows/coding-standards.yml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ jobs:
1414
php-version:
1515
- 7.4
1616
- 8.0
17+
- 8.1
1718

1819
steps:
1920
- name: "Checkout"

.github/workflows/continuous-integration.yml

+17-11
Original file line numberDiff line numberDiff line change
@@ -22,31 +22,37 @@ jobs:
2222
matrix:
2323
include:
2424
# Symfony 4.4.0 has a minimum requirement of PHP 7.1.3 but LdapRecord library
25-
# has a minimum PHP requirement of 7.2.
26-
- php-version: 7.2
27-
composer-flags: "--prefer-lowest --prefer-stable"
28-
symfony-require: "4.4.*"
25+
# has a minimum PHP requirement of 7.3.
2926
- php-version: 7.3
30-
composer-flags: "--prefer-stable"
27+
composer-flags: "--prefer-lowest --prefer-stable"
3128
symfony-require: "4.4.*"
3229
- php-version: 7.4
3330
composer-flags: "--prefer-stable"
3431
symfony-require: "4.4.*"
3532
- php-version: 7.4
3633
composer-flags: "--prefer-stable"
37-
symfony-require: "5.0.*"
34+
symfony-require: "5.3.*"
3835
- php-version: 7.4
3936
composer-flags: "--prefer-stable"
40-
symfony-require: "5.1.*"
41-
- php-version: 7.4
37+
symfony-require: "5.4.*"
38+
- php-version: 8.0
4239
composer-flags: "--prefer-stable"
43-
symfony-require: "5.2.*"
40+
symfony-require: "4.4.*"
4441
- php-version: 8.0
4542
composer-flags: "--prefer-stable"
46-
symfony-require: "5.2.*"
43+
symfony-require: "5.3.*"
44+
- php-version: 8.0
45+
composer-flags: "--prefer-stable"
46+
symfony-require: "5.4.*"
47+
- php-version: 8.0
48+
composer-flags: "--prefer-stable"
49+
symfony-require: "6.0.*"
50+
- php-version: 8.1
51+
composer-flags: "--ignore-platform-reqs"
52+
symfony-require: "5.4.*"
4753
- php-version: 8.1
4854
composer-flags: "--ignore-platform-reqs"
49-
symfony-require: "5.2.*"
55+
symfony-require: "6.0.*"
5056

5157
services:
5258
ldap:

.github/workflows/static-analysis.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ jobs:
1414
php-version:
1515
- 7.4
1616
- 8.0
17+
- 8.1
1718

1819
steps:
1920
- name: "Checkout"
@@ -32,5 +33,6 @@ jobs:
3233
- name: "Run a static analysis with phpstan/phpstan"
3334
run: "vendor/bin/phpstan analyse"
3435

35-
- name: "Run a static analysis with vimeo/psalm"
36-
run: "vendor/bin/psalm --output-format=github"
36+
# Skip Psalm until we can get it working better with Symfony bundle configuration files.
37+
# - name: "Run a static analysis with vimeo/psalm"
38+
# run: "vendor/bin/psalm --output-format=github"

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ vendor/
22
composer.lock
33
phpunit.xml
44
.php_cs.cache
5+
.php-cs-fixer.cache
56
.phpunit.result.cache
67
composer.phar
78
package.tar
+9-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
<?php
22

3-
return PhpCsFixer\Config::create()
3+
$finder = PhpCsFixer\Finder::create()
4+
->in(__DIR__)
5+
->append([__FILE__]);
6+
7+
// @See https://github.com/FriendsOfPHP/PHP-CS-Fixer
8+
$config = new PhpCsFixer\Config();
9+
10+
return $config
411
->setRules([
512
'@Symfony' => true,
613
'@Symfony:risky' => true,
@@ -15,9 +22,4 @@
1522
'php_unit_method_casing' => ['case' => 'snake_case'],
1623
])
1724
->setRiskyAllowed(true)
18-
->setFinder(
19-
PhpCsFixer\Finder::create()
20-
->in(__DIR__)
21-
->append([__FILE__])
22-
)
23-
;
25+
->setFinder($finder);

DependencyInjection/Configuration.php

+172-4
Original file line numberDiff line numberDiff line change
@@ -4,60 +4,230 @@
44

55
namespace Iter8\Bundle\LdapRecordBundle\DependencyInjection;
66

7+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
78
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
89
use Symfony\Component\Config\Definition\ConfigurationInterface;
910

1011
final class Configuration implements ConfigurationInterface
1112
{
13+
/**
14+
* @psalm-return TreeBuilder<'array'>
15+
*
16+
* @phpstan-return TreeBuilder
17+
*/
1218
public function getConfigTreeBuilder(): TreeBuilder
1319
{
1420
$treeBuilder = new TreeBuilder('iter8_ldap_record');
1521

1622
$rootNode = $treeBuilder->getRootNode();
1723

24+
$this->addHostsSection($rootNode);
25+
$this->addBaseDnSection($rootNode);
26+
$this->addUsernameSection($rootNode);
27+
$this->addPasswordSection($rootNode);
28+
$this->addPortSection($rootNode);
29+
$this->addUseSslSection($rootNode);
30+
$this->addUseTlsSection($rootNode);
31+
$this->addVersionSection($rootNode);
32+
$this->addTimeoutSection($rootNode);
33+
$this->addFollowReferralsSection($rootNode);
34+
$this->addAutoConnectSection($rootNode);
35+
$this->addOptionsSection($rootNode);
36+
37+
return $treeBuilder;
38+
}
39+
40+
private function addHostsSection(ArrayNodeDefinition $rootNode): void
41+
{
42+
/*
43+
* @psalm-suppress PossiblyNullReference
44+
* @psalm-suppress PossiblyUndefinedMethod
45+
* @psalm-suppress ReservedWord
46+
*/
1847
$rootNode
1948
->children()
2049
->arrayNode('hosts')
2150
->requiresAtLeastOneElement()
22-
->scalarPrototype()
23-
->end()
51+
->scalarPrototype()->end()
2452
->end()
53+
->end();
54+
}
55+
56+
private function addBaseDnSection(ArrayNodeDefinition $rootNode): void
57+
{
58+
/*
59+
* @psalm-suppress PossiblyNullReference
60+
* @psalm-suppress PossiblyUndefinedMethod
61+
* @psalm-suppress ReservedWord
62+
* @psalm-suppress UnusedMethodCall
63+
*/
64+
$rootNode
65+
->children()
2566
->scalarNode('base_dn')
2667
->isRequired()
2768
->cannotBeEmpty()
2869
->end()
70+
->end();
71+
}
72+
73+
private function addUsernameSection(ArrayNodeDefinition $rootNode): void
74+
{
75+
/*
76+
* @psalm-suppress PossiblyNullReference
77+
* @psalm-suppress PossiblyUndefinedMethod
78+
* @psalm-suppress ReservedWord
79+
* @psalm-suppress UnusedMethodCall
80+
*/
81+
$rootNode
82+
->children()
2983
->scalarNode('username')
3084
->isRequired()
3185
->cannotBeEmpty()
3286
->end()
87+
->end();
88+
}
89+
90+
private function addPasswordSection(ArrayNodeDefinition $rootNode): void
91+
{
92+
/*
93+
* @psalm-suppress PossiblyNullReference
94+
* @psalm-suppress PossiblyUndefinedMethod
95+
* @psalm-suppress ReservedWord
96+
* @psalm-suppress UnusedMethodCall
97+
*/
98+
$rootNode
99+
->children()
33100
->scalarNode('password')
34101
->isRequired()
35102
->end()
103+
->end();
104+
}
105+
106+
private function addPortSection(ArrayNodeDefinition $rootNode): void
107+
{
108+
/*
109+
* @psalm-suppress PossiblyNullReference
110+
* @psalm-suppress PossiblyUndefinedMethod
111+
* @psalm-suppress ReservedWord
112+
* @psalm-suppress UnusedMethodCall
113+
*/
114+
$rootNode
115+
->children()
36116
->integerNode('port')
37117
->min(1)
38118
->max(65535)
39119
->defaultValue(389)
40120
->end()
121+
->end();
122+
}
123+
124+
private function addUseSslSection(ArrayNodeDefinition $rootNode): void
125+
{
126+
/*
127+
* @psalm-suppress PossiblyNullReference
128+
* @psalm-suppress PossiblyUndefinedMethod
129+
* @psalm-suppress ReservedWord
130+
* @psalm-suppress UnusedMethodCall
131+
*/
132+
$rootNode
133+
->children()
41134
->booleanNode('use_ssl')
42135
->defaultFalse()
43136
->end()
137+
->end();
138+
}
139+
140+
private function addUseTlsSection(ArrayNodeDefinition $rootNode): void
141+
{
142+
/*
143+
* @psalm-suppress PossiblyNullReference
144+
* @psalm-suppress PossiblyUndefinedMethod
145+
* @psalm-suppress ReservedWord
146+
* @psalm-suppress UnusedMethodCall
147+
*/
148+
$rootNode
149+
->children()
44150
->booleanNode('use_tls')
45151
->defaultFalse()
46152
->end()
153+
->end();
154+
}
155+
156+
private function addVersionSection(ArrayNodeDefinition $rootNode): void
157+
{
158+
/*
159+
* @psalm-suppress PossiblyNullReference
160+
* @psalm-suppress PossiblyUndefinedMethod
161+
* @psalm-suppress ReservedWord
162+
* @psalm-suppress UnusedMethodCall
163+
*/
164+
$rootNode
165+
->children()
47166
->enumNode('version')
48167
->values([2, 3])
49168
->defaultValue(3)
50169
->end()
170+
->end();
171+
}
172+
173+
private function addTimeoutSection(ArrayNodeDefinition $rootNode): void
174+
{
175+
/*
176+
* @psalm-suppress PossiblyNullReference
177+
* @psalm-suppress PossiblyUndefinedMethod
178+
* @psalm-suppress ReservedWord
179+
* @psalm-suppress UnusedMethodCall
180+
*/
181+
$rootNode
182+
->children()
51183
->integerNode('timeout')
52184
->info('Timeout (in seconds).')
53185
->defaultValue(5)
54186
->end()
187+
->end();
188+
}
189+
190+
private function addFollowReferralsSection(ArrayNodeDefinition $rootNode): void
191+
{
192+
/*
193+
* @psalm-suppress PossiblyNullReference
194+
* @psalm-suppress PossiblyUndefinedMethod
195+
* @psalm-suppress ReservedWord
196+
* @psalm-suppress UnusedMethodCall
197+
*/
198+
$rootNode
199+
->children()
55200
->booleanNode('follow_referrals')
56201
->defaultFalse()
57202
->end()
203+
->end();
204+
}
205+
206+
private function addAutoConnectSection(ArrayNodeDefinition $rootNode): void
207+
{
208+
/*
209+
* @psalm-suppress PossiblyNullReference
210+
* @psalm-suppress PossiblyUndefinedMethod
211+
* @psalm-suppress ReservedWord
212+
* @psalm-suppress UnusedMethodCall
213+
*/
214+
$rootNode
215+
->children()
58216
->booleanNode('auto_connect')
59217
->defaultFalse()
60218
->end()
219+
->end();
220+
}
221+
222+
private function addOptionsSection(ArrayNodeDefinition $rootNode): void
223+
{
224+
/*
225+
* @psalm-suppress PossiblyNullReference
226+
* @psalm-suppress PossiblyUndefinedMethod
227+
* @psalm-suppress ReservedWord
228+
*/
229+
$rootNode
230+
->children()
61231
->arrayNode('options')
62232
->arrayPrototype()
63233
->children()
@@ -67,7 +237,5 @@ public function getConfigTreeBuilder(): TreeBuilder
67237
->end()
68238
->end()
69239
->end();
70-
71-
return $treeBuilder;
72240
}
73241
}

DependencyInjection/Iter8LdapRecordExtension.php

+6
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,18 @@ protected function loadInternal(
2222
ContainerBuilder $container
2323
): void {
2424
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
25+
/* @psalm-suppress ReservedWord */
2526
$loader->load('services.xml');
2627

2728
if ($mergedConfig['use_ssl'] && $mergedConfig['use_tls']) {
2829
throw new InvalidArgumentException(self::EXCEPTION_TLS_AND_SSL);
2930
}
3031

32+
/**
33+
* @var bool $shouldAutoConnect
34+
*
35+
* @phpcsSuppress SlevomatCodingStandard.PHP.RequireExplicitAssertion.RequiredExplicitAssertion
36+
*/
3137
$shouldAutoConnect = $mergedConfig['auto_connect'];
3238
unset($mergedConfig['auto_connect']);
3339

Tests/DependencyInjection/Iter8LdapRecordExtensionTest.php

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ public function test_is_connected_with_auto_connect_enabled(): void
8080
self::assertTrue($connection->isConnected());
8181
}
8282

83+
/**
84+
* @return array<string, mixed>
85+
*/
8386
private function baseConfig(): array
8487
{
8588
return [

Tests/TestCase.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ protected function getLdapConfig(): array
1414
$h = @ldap_connect((string) getenv('LDAP_HOST'), (int) getenv('LDAP_PORT'));
1515
@ldap_set_option($h, \LDAP_OPT_PROTOCOL_VERSION, 3);
1616

17-
if (!\is_resource($h) || !@ldap_bind($h)) {
17+
if (null === $h || !@ldap_bind($h)) {
1818
self::markTestSkipped('No server is listening on LDAP_HOST:LDAP_PORT');
1919
}
2020

0 commit comments

Comments
 (0)