|
4 | 4 |
|
5 | 5 | namespace Overblog\GraphQLBundle\Config; |
6 | 6 |
|
| 7 | +use Overblog\GraphQLBundle\ExpressionLanguage\ExpressionLanguage; |
7 | 8 | use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; |
| 9 | +use Symfony\Component\Config\Definition\Builder\NodeDefinition; |
8 | 10 | use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition; |
9 | 11 | use Symfony\Component\Config\Definition\Builder\TreeBuilder; |
10 | 12 | use Symfony\Component\Config\Definition\Builder\VariableNodeDefinition; |
@@ -32,11 +34,6 @@ public static function create(): self |
32 | 34 | return new static(); |
33 | 35 | } |
34 | 36 |
|
35 | | - protected function resolveTypeSection(): VariableNodeDefinition |
36 | | - { |
37 | | - return self::createNode('resolveType', 'variable'); |
38 | | - } |
39 | | - |
40 | 37 | protected function nameSection(): ScalarNodeDefinition |
41 | 38 | { |
42 | 39 | /** @var ScalarNodeDefinition $node */ |
@@ -156,6 +153,87 @@ protected function typeSection(bool $isRequired = false): ScalarNodeDefinition |
156 | 153 | return $node; |
157 | 154 | } |
158 | 155 |
|
| 156 | + protected function resolverNormalization(NodeDefinition $node, string $new, string $old): void |
| 157 | + { |
| 158 | + $node |
| 159 | + ->beforeNormalization() |
| 160 | + ->ifTrue(fn ($options) => !empty($options[$old]) && empty($options[$new])) |
| 161 | + ->then(function ($options) use ($old, $new) { |
| 162 | + if (is_callable($options[$old])) { |
| 163 | + if (is_array($options[$old])) { |
| 164 | + $options[$new]['method'] = implode('::', $options[$old]); |
| 165 | + } else { |
| 166 | + $options[$new]['method'] = $options[$old]; |
| 167 | + } |
| 168 | + } elseif (is_string($options[$old])) { |
| 169 | + $options[$new]['expression'] = ExpressionLanguage::stringHasTrigger($options[$old]) ? |
| 170 | + ExpressionLanguage::unprefixExpression($options[$old]) : |
| 171 | + json_encode($options[$old]); |
| 172 | + } else { |
| 173 | + $options[$new]['expression'] = json_encode($options[$old]); |
| 174 | + } |
| 175 | + |
| 176 | + return $options; |
| 177 | + }) |
| 178 | + ->end() |
| 179 | + ->beforeNormalization() |
| 180 | + ->ifTrue(fn ($options) => is_array($options) && array_key_exists($old, $options)) |
| 181 | + ->then(function ($options) use ($old) { |
| 182 | + unset($options[$old]); |
| 183 | + |
| 184 | + return $options; |
| 185 | + }) |
| 186 | + ->end() |
| 187 | + ->validate() |
| 188 | + ->ifTrue(fn (array $v) => !empty($v[$new]) && !empty($v[$old])) |
| 189 | + ->thenInvalid(sprintf( |
| 190 | + '"%s" and "%s" should not be use together in "%%s".', |
| 191 | + $new, |
| 192 | + $old, |
| 193 | + )) |
| 194 | + ->end() |
| 195 | + ; |
| 196 | + } |
| 197 | + |
| 198 | + protected function resolverSection(string $name, string $info): ArrayNodeDefinition |
| 199 | + { |
| 200 | + /** @var ArrayNodeDefinition $node */ |
| 201 | + $node = self::createNode($name); |
| 202 | + /** @phpstan-ignore-next-line */ |
| 203 | + $node |
| 204 | + ->info($info) |
| 205 | + ->validate() |
| 206 | + ->ifTrue(fn (array $v) => !empty($v['method']) && !empty($v['expression'])) |
| 207 | + ->thenInvalid('"method" and "expression" should not be use together.') |
| 208 | + ->end() |
| 209 | + ->beforeNormalization() |
| 210 | + // Allow short syntax |
| 211 | + ->ifTrue(fn ($options) => is_string($options) && ExpressionLanguage::stringHasTrigger($options)) |
| 212 | + ->then(fn ($options) => ['expression' => ExpressionLanguage::unprefixExpression($options)]) |
| 213 | + ->end() |
| 214 | + ->beforeNormalization() |
| 215 | + ->ifTrue(fn ($options) => is_string($options) && !ExpressionLanguage::stringHasTrigger($options)) |
| 216 | + ->then(fn ($options) => ['method' => $options]) |
| 217 | + ->end() |
| 218 | + ->beforeNormalization() |
| 219 | + // clean expression |
| 220 | + ->ifTrue(fn ($options) => isset($options['expression']) && is_string($options['expression']) && ExpressionLanguage::stringHasTrigger($options['expression'])) |
| 221 | + ->then(function ($options) { |
| 222 | + $options['expression'] = ExpressionLanguage::unprefixExpression($options['expression']); |
| 223 | + |
| 224 | + return $options; |
| 225 | + }) |
| 226 | + ->end() |
| 227 | + ->children() |
| 228 | + ->scalarNode('method')->end() |
| 229 | + ->scalarNode('expression')->end() |
| 230 | + ->scalarNode('id')->end() |
| 231 | + ->end() |
| 232 | + ; |
| 233 | + |
| 234 | + return $node; |
| 235 | + } |
| 236 | + |
159 | 237 | /** |
160 | 238 | * @return mixed |
161 | 239 | * |
|
0 commit comments