Commit 92935e5
committed
feature symfony#62917 [Console] Add ArgumentResolver (chalasr)
This PR was merged into the 8.1 branch.
Discussion
----------
[Console] Add ArgumentResolver
| Q | A
| ------------- | ---
| Branch? | 8.1
| Bug fix? | no
| New feature? | yes
| Deprecations? | no
| Issues | Fix symfony#62829, symfony#59794
| License | MIT
Happy new year, Symfony lovers!
This PR adds argument resolver support to Console commands similar to HttpKernel's controller argument resolution, allowing custom resolution of command input arguments and options through ValueResolverInterface implementations.
It includes the following core resolvers:
- BuiltinTypeValueResolver for PHP built-in types
- BackedEnumValueResolver
- DateTimeValueResolver for date/time objects
- UidValueResolver for Uuid/Ulid objects
- VariadicValueResolver for variadic parameters
- MapInputValueResolver for DTO hydration
- EntityValueResolver in Doctrine Bridge that shares most of its logic with the HTTP counterpart through a trait
- ServiceValueResolver for service injection
- DefaultValueResolver for fallback values
All those are wired through compiler passes hosted by Console. Resolvers can be targeted to specific arguments using the `#[AsTargetedValueResolver]` attribute, following the same pattern as HttpKernel.
| Feature | HttpKernel | Console |
|-------------------------|-------------------------|----------------|
| Built-in types | Yes | Yes |
| BackedEnum | Yes | Yes |
| DateTime | Yes | Yes |
| Uid | Yes | Yes |
| Variadic parameters | Yes | Yes |
| Entity (Doctrine) | Yes | Yes |
| DTO | Yes (MapRequestPayload) | Yes (MapInput) |
| Targeted resolvers | Yes | Yes |
| Default value fallback | Yes | Yes |
| Service injection | Yes | Yes |
| Request/Input injection | Yes | Yes |
| Output/Style injection | No (irrelevant) | Yes |
| CurrentUser resolution | Yes | No (irrelevant) |
| Custom Resolvers | Yes | Yes |
This brings feature parity between HTTP Controllers and CLI commands, the latter being given more and more well deserved attention in the AI era we're living.
All resolvers except the `ServiceValueResolver` and `MapInputValueResolver` require the to-be-resolved parameter to either have an `#[Argument]` or an `#[Option]` attribute to indicate whether it maps to an input argument or an input option.
Also `#[MapInput]` attribute now supports `\BackedEnum` and `\DateTime*` resolution for DTO properties (the actual resolution logic is delegated to the corresponding value resolvers).
In symfony#59794 I failed to come up with an abstraction that makes sense to share foundations and plumbing of this feature between HttpKernel and Console, i.e. one that does not involve too much tradeoffs on the public API (supporting both Input and Request is hard) and/or tons of deprecations.
As such, this makes the Console implements his own system. This implies that ~35% of the attached patch is adapted from HttpKernel, which is on purpose and I think is fine: better abstract later if we have some serious enough use case.
Let's make this happen!
Commits
-------
7008e30 [Console] Add argument resolvers61 files changed
Lines changed: 4903 additions & 247 deletions
File tree
- src/Symfony
- Bridge/Doctrine
- ArgumentResolver
- Console
- Tests/Console/ArgumentResolver
- Bundle/FrameworkBundle
- Console
- DependencyInjection
- Compiler
- Resources/config
- Tests
- Fixtures/Console
- Functional
- app/ConsoleArgumentResolver
- Component/Console
- ArgumentResolver
- Exception
- ValueResolver
- Attribute
- Reflection
- Command
- DependencyInjection
- Interaction
- Tests
- ArgumentResolver/ValueResolver
- Command
- DependencyInjection
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 181 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
Lines changed: 8 additions & 97 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | 14 | | |
18 | 15 | | |
19 | 16 | | |
| |||
32 | 29 | | |
33 | 30 | | |
34 | 31 | | |
| 32 | + | |
| 33 | + | |
35 | 34 | | |
36 | 35 | | |
37 | 36 | | |
| |||
56 | 55 | | |
57 | 56 | | |
58 | 57 | | |
59 | | - | |
| 58 | + | |
60 | 59 | | |
61 | 60 | | |
62 | 61 | | |
63 | 62 | | |
64 | 63 | | |
65 | | - | |
| 64 | + | |
| 65 | + | |
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
69 | | - | |
| 69 | + | |
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
78 | | - | |
79 | | - | |
80 | | - | |
81 | | - | |
82 | | - | |
| 78 | + | |
83 | 79 | | |
84 | 80 | | |
85 | 81 | | |
| |||
89 | 85 | | |
90 | 86 | | |
91 | 87 | | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
119 | | - | |
120 | | - | |
121 | | - | |
122 | | - | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | 88 | | |
136 | 89 | | |
137 | 90 | | |
| |||
191 | 144 | | |
192 | 145 | | |
193 | 146 | | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | | - | |
201 | | - | |
202 | 147 | | |
203 | 148 | | |
204 | 149 | | |
205 | 150 | | |
206 | | - | |
207 | | - | |
208 | | - | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
224 | | - | |
225 | | - | |
226 | | - | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | | - | |
| 151 | + | |
241 | 152 | | |
242 | 153 | | |
0 commit comments