b2pweb /
bdf-prime-bundle
| 1 | <?php |
||||||
| 2 | |||||||
| 3 | namespace Bdf\PrimeBundle\DependencyInjection; |
||||||
| 4 | |||||||
| 5 | use Bdf\Prime\Configuration as PrimeConfiguration; |
||||||
| 6 | use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; |
||||||
| 7 | use Symfony\Component\Config\Definition\Builder\NodeDefinition; |
||||||
| 8 | use Symfony\Component\Config\Definition\Builder\TreeBuilder; |
||||||
| 9 | use Symfony\Component\Config\Definition\ConfigurationInterface; |
||||||
| 10 | |||||||
| 11 | /** |
||||||
| 12 | * Configuration. |
||||||
| 13 | */ |
||||||
| 14 | class Configuration implements ConfigurationInterface |
||||||
| 15 | { |
||||||
| 16 | /** |
||||||
| 17 | * @var bool |
||||||
| 18 | */ |
||||||
| 19 | private $debug; |
||||||
| 20 | |||||||
| 21 | /** |
||||||
| 22 | * @param bool $debug Whether to use the debug mode |
||||||
| 23 | */ |
||||||
| 24 | 7 | public function __construct($debug = false) |
|||||
| 25 | { |
||||||
| 26 | 7 | $this->debug = (bool) $debug; |
|||||
| 27 | } |
||||||
| 28 | |||||||
| 29 | /** |
||||||
| 30 | * {@inheritDoc} |
||||||
| 31 | */ |
||||||
| 32 | 7 | public function getConfigTreeBuilder() |
|||||
| 33 | { |
||||||
| 34 | 7 | $treeBuilder = new TreeBuilder('prime'); |
|||||
| 35 | 7 | $node = $treeBuilder->getRootNode(); |
|||||
| 36 | 7 | $node |
|||||
| 37 | 7 | ->children() |
|||||
| 38 | 7 | ->booleanNode('activerecord')->defaultFalse()->end() |
|||||
| 39 | 7 | ->scalarNode('hydrators')->defaultValue('%kernel.cache_dir%/prime/hydrators/loader.php')->end() |
|||||
| 40 | 7 | ->scalarNode('serializer')->info('The bdf serializer service id.')->end() |
|||||
| 41 | 7 | ->scalarNode('default_connection')->defaultNull()->end() |
|||||
| 42 | 7 | ->append($this->getConnectionsNode()) |
|||||
| 43 | 7 | ->append($this->getMigrationNode()) |
|||||
| 44 | 7 | ->append($this->getCacheNode()) |
|||||
| 45 | 7 | ->end() |
|||||
| 46 | 7 | ; |
|||||
| 47 | |||||||
| 48 | 7 | $this->configureConfigurationNode($node, true); |
|||||
| 49 | |||||||
| 50 | 7 | return $treeBuilder; |
|||||
| 51 | } |
||||||
| 52 | |||||||
| 53 | /** |
||||||
| 54 | * Adds the configuration node of the connection |
||||||
| 55 | * Could be the global config or a connection config. |
||||||
| 56 | */ |
||||||
| 57 | 7 | private function configureConfigurationNode(ArrayNodeDefinition $node, bool $addDefault): void |
|||||
| 58 | { |
||||||
| 59 | 7 | $parametersNode = $node->children(); |
|||||
| 60 | |||||||
| 61 | 7 | $loggingNode = $parametersNode->booleanNode('logging'); |
|||||
| 62 | 7 | $profilingNode = $parametersNode->booleanNode('profiling'); |
|||||
| 63 | 7 | $autoCommitNode = $parametersNode->booleanNode('auto_commit'); |
|||||
| 64 | |||||||
| 65 | 7 | if (true === $addDefault) { |
|||||
| 66 | 7 | $loggingNode->defaultValue($this->debug); |
|||||
| 67 | 7 | $profilingNode->defaultValue($this->debug); |
|||||
| 68 | 7 | $autoCommitNode->defaultNull(); |
|||||
| 69 | } |
||||||
| 70 | |||||||
| 71 | 7 | $parametersNode->append($this->getTypesNode()); |
|||||
| 72 | } |
||||||
| 73 | |||||||
| 74 | /** |
||||||
| 75 | * @return NodeDefinition |
||||||
| 76 | */ |
||||||
| 77 | 7 | private function getConnectionsNode() |
|||||
| 78 | { |
||||||
| 79 | 7 | $root = (new TreeBuilder('connections'))->getRootNode(); |
|||||
| 80 | |||||||
| 81 | 7 | $connectionNode = $root |
|||||
| 82 | 7 | ->requiresAtLeastOneElement() |
|||||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||||
| 83 | 7 | ->useAttributeAsKey('name') |
|||||
| 84 | 7 | ->arrayPrototype() |
|||||
| 85 | 7 | ->isRequired() |
|||||
| 86 | 7 | ->beforeNormalization() |
|||||
| 87 | 7 | ->ifString() |
|||||
| 88 | 7 | ->then(static function ($v) { |
|||||
| 89 | 1 | return ['url' => $v]; |
|||||
| 90 | 7 | }) |
|||||
| 91 | 7 | ->end() |
|||||
| 92 | 7 | ; |
|||||
| 93 | |||||||
| 94 | 7 | $this->configureDbalDriverNode($connectionNode); |
|||||
| 95 | 7 | $this->configureConfigurationNode($connectionNode, false); |
|||||
| 96 | |||||||
| 97 | 7 | $connectionNode |
|||||
| 98 | 7 | ->children() |
|||||
| 99 | 7 | ->scalarNode('driver')->end() |
|||||
| 100 | 7 | ->scalarNode('platform_service')->end() |
|||||
| 101 | 7 | ->scalarNode('server_version')->end() |
|||||
| 102 | 7 | ->scalarNode('driver_class')->end() |
|||||
| 103 | 7 | ->scalarNode('wrapper_class')->end() |
|||||
| 104 | 7 | ->arrayNode('options') |
|||||
| 105 | 7 | ->useAttributeAsKey('key') |
|||||
| 106 | 7 | ->variablePrototype()->end() |
|||||
| 107 | 7 | ->end() |
|||||
| 108 | 7 | ->arrayNode('default_table_options') |
|||||
| 109 | 7 | ->info("This option is used by the schema-tool and affects generated SQL. Possible keys include 'charset','collate', and 'engine'.") |
|||||
| 110 | 7 | ->useAttributeAsKey('name') |
|||||
| 111 | 7 | ->scalarPrototype()->end() |
|||||
| 112 | 7 | ->end() |
|||||
| 113 | 7 | ->append($this->getPlatformTypesNode()) |
|||||
| 114 | 7 | ->end(); |
|||||
| 115 | |||||||
| 116 | 7 | $slaveNode = $connectionNode->children()->arrayNode('read'); |
|||||
| 117 | |||||||
| 118 | 7 | $this->configureDbalDriverNode($slaveNode); |
|||||
| 119 | |||||||
| 120 | 7 | $shardNode = $connectionNode |
|||||
| 121 | 7 | ->children() |
|||||
| 122 | 7 | ->scalarNode('shard_choser')->end() |
|||||
| 123 | 7 | ->scalarNode('distribution_key')->end() |
|||||
| 124 | 7 | ->arrayNode('shards') |
|||||
| 125 | 7 | ->requiresAtLeastOneElement() |
|||||
| 126 | 7 | ->useAttributeAsKey('name') |
|||||
| 127 | 7 | ->arrayPrototype(); |
|||||
| 128 | |||||||
| 129 | 7 | $this->configureDbalDriverNode($shardNode); |
|||||
| 130 | |||||||
| 131 | 7 | return $root; |
|||||
| 132 | } |
||||||
| 133 | |||||||
| 134 | /** |
||||||
| 135 | * Adds config keys related to params processed by the DBAL drivers. |
||||||
| 136 | * |
||||||
| 137 | * These keys are available for slave configurations too. |
||||||
| 138 | */ |
||||||
| 139 | 7 | private function configureDbalDriverNode(ArrayNodeDefinition $node): void |
|||||
| 140 | { |
||||||
| 141 | 7 | $node |
|||||
| 142 | 7 | ->children() |
|||||
| 143 | 7 | ->scalarNode('url')->info('A URL with connection information; any parameter value parsed from this string will override explicitly set parameters')->end() |
|||||
| 144 | 7 | ->scalarNode('dbname')->end() |
|||||
|
0 ignored issues
–
show
The method
scalarNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 145 | 7 | ->scalarNode('host')->end() |
|||||
| 146 | 7 | ->scalarNode('port')->end() |
|||||
| 147 | 7 | ->scalarNode('user')->end() |
|||||
| 148 | 7 | ->scalarNode('password')->end() |
|||||
| 149 | 7 | ->scalarNode('application_name')->end() |
|||||
| 150 | 7 | ->scalarNode('charset')->end() |
|||||
| 151 | 7 | ->scalarNode('path')->end() |
|||||
| 152 | 7 | ->booleanNode('memory')->end() |
|||||
| 153 | 7 | ->scalarNode('unix_socket')->info('The unix socket to use for MySQL')->end() |
|||||
| 154 | 7 | ->booleanNode('persistent')->info('True to use as persistent connection for the ibm_db2 driver')->end() |
|||||
| 155 | 7 | ->scalarNode('protocol')->info('The protocol to use for the ibm_db2 driver (default to TCPIP if omitted)')->end() |
|||||
| 156 | 7 | ->booleanNode('service') |
|||||
| 157 | 7 | ->info('True to use SERVICE_NAME as connection parameter instead of SID for Oracle') |
|||||
| 158 | 7 | ->end() |
|||||
| 159 | 7 | ->scalarNode('servicename') |
|||||
| 160 | 7 | ->info( |
|||||
| 161 | 7 | 'Overrules dbname parameter if given and used as SERVICE_NAME or SID connection parameter '. |
|||||
| 162 | 7 | 'for Oracle depending on the service parameter.' |
|||||
| 163 | 7 | ) |
|||||
| 164 | 7 | ->end() |
|||||
| 165 | 7 | ->scalarNode('sessionMode') |
|||||
| 166 | 7 | ->info('The session mode to use for the oci8 driver') |
|||||
| 167 | 7 | ->end() |
|||||
| 168 | 7 | ->scalarNode('server') |
|||||
| 169 | 7 | ->info('The name of a running database server to connect to for SQL Anywhere.') |
|||||
| 170 | 7 | ->end() |
|||||
| 171 | 7 | ->scalarNode('default_dbname') |
|||||
| 172 | 7 | ->info( |
|||||
| 173 | 7 | 'Override the default database (postgres) to connect to for PostgreSQL connexion.' |
|||||
| 174 | 7 | ) |
|||||
| 175 | 7 | ->end() |
|||||
| 176 | 7 | ->scalarNode('sslmode') |
|||||
| 177 | 7 | ->info( |
|||||
| 178 | 7 | 'Determines whether or with what priority a SSL TCP/IP connection will be negotiated with '. |
|||||
| 179 | 7 | 'the server for PostgreSQL.' |
|||||
| 180 | 7 | ) |
|||||
| 181 | 7 | ->end() |
|||||
| 182 | 7 | ->scalarNode('sslrootcert') |
|||||
| 183 | 7 | ->info( |
|||||
| 184 | 7 | 'The name of a file containing SSL certificate authority (CA) certificate(s). '. |
|||||
| 185 | 7 | 'If the file exists, the server\'s certificate will be verified to be signed by one of these authorities.' |
|||||
| 186 | 7 | ) |
|||||
| 187 | 7 | ->end() |
|||||
| 188 | 7 | ->scalarNode('sslcert') |
|||||
| 189 | 7 | ->info( |
|||||
| 190 | 7 | 'The path to the SSL client certificate file for PostgreSQL.' |
|||||
| 191 | 7 | ) |
|||||
| 192 | 7 | ->end() |
|||||
| 193 | 7 | ->scalarNode('sslkey') |
|||||
| 194 | 7 | ->info( |
|||||
| 195 | 7 | 'The path to the SSL client key file for PostgreSQL.' |
|||||
| 196 | 7 | ) |
|||||
| 197 | 7 | ->end() |
|||||
| 198 | 7 | ->scalarNode('sslcrl') |
|||||
| 199 | 7 | ->info( |
|||||
| 200 | 7 | 'The file name of the SSL certificate revocation list for PostgreSQL.' |
|||||
| 201 | 7 | ) |
|||||
| 202 | 7 | ->end() |
|||||
| 203 | 7 | ->booleanNode('pooled')->info('True to use a pooled server with the oci8/pdo_oracle driver')->end() |
|||||
| 204 | 7 | ->booleanNode('MultipleActiveResultSets')->info('Configuring MultipleActiveResultSets for the pdo_sqlsrv driver')->end() |
|||||
| 205 | 7 | // ->booleanNode('use_savepoints')->info('Use savepoints for nested transactions')->end() |
|||||
| 206 | 7 | ->scalarNode('instancename') |
|||||
| 207 | 7 | ->info( |
|||||
| 208 | 7 | 'Optional parameter, complete whether to add the INSTANCE_NAME parameter in the connection.'. |
|||||
| 209 | 7 | ' It is generally used to connect to an Oracle RAC server to select the name'. |
|||||
| 210 | 7 | ' of a particular instance.' |
|||||
| 211 | 7 | ) |
|||||
| 212 | 7 | ->end() |
|||||
| 213 | 7 | ->scalarNode('connectstring') |
|||||
| 214 | 7 | ->info( |
|||||
| 215 | 7 | 'Complete Easy Connect connection descriptor, see https://docs.oracle.com/database/121/NETAG/naming.htm.'. |
|||||
| 216 | 7 | 'When using this option, you will still need to provide the user and password parameters, but the other '. |
|||||
| 217 | 7 | 'parameters will no longer be used. Note that when using this parameter, the getHost and getPort methods'. |
|||||
| 218 | 7 | ' from Doctrine\DBAL\Connection will no longer function as expected.' |
|||||
| 219 | 7 | ) |
|||||
| 220 | 7 | ->end() |
|||||
| 221 | 7 | ->end() |
|||||
| 222 | 7 | ->beforeNormalization() |
|||||
| 223 | 7 | ->ifTrue(static function ($v) { |
|||||
| 224 | 7 | return !isset($v['sessionMode']) && isset($v['session_mode']); |
|||||
| 225 | 7 | }) |
|||||
| 226 | 7 | ->then(static function ($v) { |
|||||
| 227 | $v['sessionMode'] = $v['session_mode']; |
||||||
| 228 | unset($v['session_mode']); |
||||||
| 229 | |||||||
| 230 | return $v; |
||||||
| 231 | 7 | }) |
|||||
| 232 | 7 | ->end() |
|||||
| 233 | 7 | ->beforeNormalization() |
|||||
| 234 | 7 | ->ifTrue(static function ($v) { |
|||||
| 235 | 7 | return !isset($v['MultipleActiveResultSets']) && isset($v['multiple_active_result_sets']); |
|||||
| 236 | 7 | }) |
|||||
| 237 | 7 | ->then(static function ($v) { |
|||||
| 238 | $v['MultipleActiveResultSets'] = $v['multiple_active_result_sets']; |
||||||
| 239 | unset($v['multiple_active_result_sets']); |
||||||
| 240 | |||||||
| 241 | return $v; |
||||||
| 242 | 7 | }) |
|||||
| 243 | 7 | ->end(); |
|||||
| 244 | } |
||||||
| 245 | |||||||
| 246 | /** |
||||||
| 247 | * @return NodeDefinition |
||||||
| 248 | */ |
||||||
| 249 | 7 | private function getTypesNode() |
|||||
| 250 | { |
||||||
| 251 | 7 | $root = (new TreeBuilder('types'))->getRootNode(); |
|||||
| 252 | 7 | $root |
|||||
| 253 | 7 | ->useAttributeAsKey('name') |
|||||
|
0 ignored issues
–
show
The method
useAttributeAsKey() does not exist on Symfony\Component\Config...\Builder\NodeDefinition. It seems like you code against a sub-type of Symfony\Component\Config...\Builder\NodeDefinition such as Symfony\Component\Config...der\ArrayNodeDefinition.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||||
| 254 | 7 | ->arrayPrototype() |
|||||
| 255 | 7 | ->beforeNormalization() |
|||||
| 256 | 7 | ->ifString() |
|||||
| 257 | 7 | ->then(static function ($v) { |
|||||
| 258 | return ['class' => $v]; |
||||||
| 259 | 7 | }) |
|||||
| 260 | 7 | ->end() |
|||||
| 261 | 7 | ->children() |
|||||
| 262 | 7 | ->scalarNode('class')->isRequired()->end() |
|||||
| 263 | 7 | ->end() |
|||||
| 264 | 7 | ; |
|||||
| 265 | |||||||
| 266 | 7 | return $root; |
|||||
| 267 | } |
||||||
| 268 | |||||||
| 269 | /** |
||||||
| 270 | * @return NodeDefinition |
||||||
| 271 | */ |
||||||
| 272 | 7 | private function getPlatformTypesNode() |
|||||
| 273 | { |
||||||
| 274 | 7 | $root = (new TreeBuilder('platformTypes'))->getRootNode(); |
|||||
| 275 | 7 | $root |
|||||
| 276 | 7 | ->useAttributeAsKey('name') |
|||||
| 277 | 7 | ->arrayPrototype() |
|||||
| 278 | 7 | ->beforeNormalization() |
|||||
| 279 | 7 | ->ifString() |
|||||
| 280 | 7 | ->then(static function ($v) { |
|||||
| 281 | return ['class' => $v]; |
||||||
| 282 | 7 | }) |
|||||
| 283 | 7 | ->end() |
|||||
| 284 | 7 | ->children() |
|||||
| 285 | 7 | ->scalarNode('class')->isRequired()->end() |
|||||
| 286 | 7 | ->end() |
|||||
| 287 | 7 | ->beforeNormalization() |
|||||
| 288 | 7 | ->ifTrue(function ($value) { return !empty($value) && !method_exists(PrimeConfiguration::class, 'addPlatformType'); }) |
|||||
| 289 | 7 | ->thenInvalid('Define platform types is only supported by bdf-prime version >= 2.1') |
|||||
| 290 | 7 | ; |
|||||
| 291 | |||||||
| 292 | 7 | return $root; |
|||||
| 293 | } |
||||||
| 294 | |||||||
| 295 | /** |
||||||
| 296 | * @return NodeDefinition |
||||||
| 297 | */ |
||||||
| 298 | 7 | private function getMigrationNode() |
|||||
| 299 | { |
||||||
| 300 | 7 | $root = (new TreeBuilder('migration'))->getRootNode(); |
|||||
| 301 | 7 | $root->children() |
|||||
| 302 | 7 | ->scalarNode('path') |
|||||
| 303 | 7 | ->info('The directory path where the migration file will be stored.') |
|||||
| 304 | 7 | ->isRequired() |
|||||
| 305 | 7 | ->end() |
|||||
| 306 | 7 | ->scalarNode('connection') |
|||||
| 307 | 7 | ->info('The prime connection name to use to access to the version of migrations.') |
|||||
| 308 | 7 | ->defaultNull() |
|||||
| 309 | 7 | ->end() |
|||||
| 310 | 7 | ->scalarNode('table') |
|||||
| 311 | 7 | ->info('The table name to store the version of migrations. The default name is "migrations".') |
|||||
| 312 | 7 | ->defaultValue('migrations') |
|||||
| 313 | 7 | ->end() |
|||||
| 314 | 7 | ; |
|||||
| 315 | |||||||
| 316 | 7 | return $root; |
|||||
| 317 | } |
||||||
| 318 | |||||||
| 319 | /** |
||||||
| 320 | * @return NodeDefinition |
||||||
| 321 | */ |
||||||
| 322 | 7 | private function getCacheNode() |
|||||
| 323 | { |
||||||
| 324 | 7 | $root = (new TreeBuilder('cache'))->getRootNode(); |
|||||
| 325 | 7 | $root->children() |
|||||
| 326 | 7 | ->arrayNode('query') |
|||||
| 327 | 7 | ->info('The result cache service. Should implement Bdf\Prime\Cache\CacheInterface.') |
|||||
| 328 | 7 | ->children() |
|||||
| 329 | 7 | ->scalarNode('pool')->end() |
|||||
| 330 | 7 | ->scalarNode('service')->end() |
|||||
| 331 | 7 | ->end() |
|||||
| 332 | 7 | ->end() |
|||||
| 333 | 7 | ->arrayNode('metadata') |
|||||
| 334 | 7 | ->info('The metadata cache service. Should implement Psr\SimpleCache\CacheInterface.') |
|||||
| 335 | 7 | ->children() |
|||||
| 336 | 7 | ->scalarNode('pool')->end() |
|||||
| 337 | 7 | ->scalarNode('service')->end() |
|||||
| 338 | 7 | ->end() |
|||||
| 339 | 7 | ->end() |
|||||
| 340 | 7 | ; |
|||||
| 341 | |||||||
| 342 | 7 | return $root; |
|||||
| 343 | } |
||||||
| 344 | } |
||||||
| 345 |