14
14
use Symfony \Component \Form \FormInterface ;
15
15
use Symfony \Component \Form \FormView ;
16
16
use Symfony \Component \HttpKernel \DataCollector \Util \ValueExporter ;
17
+ use Symfony \Component \Validator \ConstraintViolation ;
17
18
use Symfony \Component \Validator \ConstraintViolationInterface ;
19
+ use Symfony \Component \VarDumper \Cloner \Data ;
20
+ use Symfony \Component \VarDumper \Cloner \VarCloner ;
21
+ use Symfony \Component \VarDumper \Caster \ExceptionCaster ;
18
22
19
23
/**
20
24
* Default implementation of {@link FormDataExtractorInterface}.
24
28
class FormDataExtractor implements FormDataExtractorInterface
25
29
{
26
30
/**
27
- * @var ValueExporter
31
+ * @var VarCloner
28
32
*/
29
- private $ valueExporter ;
33
+ private $ varCloner ;
30
34
35
+ private $ varExporter ;
31
36
/**
32
37
* Constructs a new data extractor.
38
+ *
39
+ * @param VarCloner|null $varCloner Passing a ValueExporter instance is
40
+ * deprecated since version 3.2 and will
41
+ * not be possible in 4.0.
33
42
*/
34
- public function __construct (ValueExporter $ valueExporter = null )
43
+ public function __construct ($ varCloner = null )
35
44
{
36
- $ this ->valueExporter = $ valueExporter ?: new ValueExporter ();
45
+ if ($ varCloner instanceof ValueExporter) {
46
+ @trigger_error ('Passing a ValueExporter instance to ' .__METHOD__ .'() is deprecated in version 3.2 and will be removed in 4.0. Pass a ClonerInterface instance instead. ' , E_USER_DEPRECATED );
47
+ $ varCloner = null ;
48
+ }
49
+
50
+ $ this ->valueExporter = new ValueExporter ();
51
+ $ this ->varCloner = $ varCloner ?: new VarCloner ();
37
52
}
38
53
39
54
/**
@@ -45,17 +60,17 @@ public function extractConfiguration(FormInterface $form)
45
60
'id ' => $ this ->buildId ($ form ),
46
61
'name ' => $ form ->getName (),
47
62
'type_class ' => get_class ($ form ->getConfig ()->getType ()->getInnerType ()),
48
- 'synchronized ' => $ this ->valueExporter -> exportValue ($ form ->isSynchronized ()),
63
+ 'synchronized ' => $ this ->cloneVar ($ form ->isSynchronized ()),
49
64
'passed_options ' => array (),
50
65
'resolved_options ' => array (),
51
66
);
52
67
53
68
foreach ($ form ->getConfig ()->getAttribute ('data_collector/passed_options ' , array ()) as $ option => $ value ) {
54
- $ data ['passed_options ' ][$ option ] = $ this ->valueExporter -> exportValue ($ value );
69
+ $ data ['passed_options ' ][$ option ] = $ this ->cloneVar ($ value );
55
70
}
56
71
57
72
foreach ($ form ->getConfig ()->getOptions () as $ option => $ value ) {
58
- $ data ['resolved_options ' ][$ option ] = $ this ->valueExporter -> exportValue ($ value );
73
+ $ data ['resolved_options ' ][$ option ] = $ this ->cloneVar ($ value );
59
74
}
60
75
61
76
ksort ($ data ['passed_options ' ]);
@@ -71,17 +86,17 @@ public function extractDefaultData(FormInterface $form)
71
86
{
72
87
$ data = array (
73
88
'default_data ' => array (
74
- 'norm ' => $ this ->valueExporter -> exportValue ($ form ->getNormData ()),
89
+ 'norm ' => $ this ->cloneVar ($ form ->getNormData ()),
75
90
),
76
91
'submitted_data ' => array (),
77
92
);
78
93
79
94
if ($ form ->getData () !== $ form ->getNormData ()) {
80
- $ data ['default_data ' ]['model ' ] = $ this ->valueExporter -> exportValue ($ form ->getData ());
95
+ $ data ['default_data ' ]['model ' ] = $ this ->cloneVar ($ form ->getData ());
81
96
}
82
97
83
98
if ($ form ->getViewData () !== $ form ->getNormData ()) {
84
- $ data ['default_data ' ]['view ' ] = $ this ->valueExporter -> exportValue ($ form ->getViewData ());
99
+ $ data ['default_data ' ]['view ' ] = $ this ->cloneVar ($ form ->getViewData ());
85
100
}
86
101
87
102
return $ data ;
@@ -94,17 +109,17 @@ public function extractSubmittedData(FormInterface $form)
94
109
{
95
110
$ data = array (
96
111
'submitted_data ' => array (
97
- 'norm ' => $ this ->valueExporter -> exportValue ($ form ->getNormData ()),
112
+ 'norm ' => $ this ->cloneVar ($ form ->getNormData ()),
98
113
),
99
114
'errors ' => array (),
100
115
);
101
116
102
117
if ($ form ->getViewData () !== $ form ->getNormData ()) {
103
- $ data ['submitted_data ' ]['view ' ] = $ this ->valueExporter -> exportValue ($ form ->getViewData ());
118
+ $ data ['submitted_data ' ]['view ' ] = $ this ->cloneVar ($ form ->getViewData ());
104
119
}
105
120
106
121
if ($ form ->getData () !== $ form ->getNormData ()) {
107
- $ data ['submitted_data ' ]['model ' ] = $ this ->valueExporter -> exportValue ($ form ->getData ());
122
+ $ data ['submitted_data ' ]['model ' ] = $ this ->cloneVar ($ form ->getData ());
108
123
}
109
124
110
125
foreach ($ form ->getErrors () as $ error ) {
@@ -119,39 +134,29 @@ public function extractSubmittedData(FormInterface $form)
119
134
$ cause = $ error ->getCause ();
120
135
121
136
while (null !== $ cause ) {
122
- if ($ cause instanceof ConstraintViolationInterface) {
123
- $ errorData ['trace ' ][] = array (
124
- 'class ' => $ this ->valueExporter ->exportValue (get_class ($ cause )),
125
- 'root ' => $ this ->valueExporter ->exportValue ($ cause ->getRoot ()),
126
- 'path ' => $ this ->valueExporter ->exportValue ($ cause ->getPropertyPath ()),
127
- 'value ' => $ this ->valueExporter ->exportValue ($ cause ->getInvalidValue ()),
128
- );
137
+ $ levelCause = new ConstraintViolation ($ cause ->getMessage (), $ cause ->getMessageTemplate (), $ cause ->getParameters (), $ cause ->getRoot (), $ cause ->getPropertyPath (), $ cause ->getInvalidValue (), $ cause ->getPlural (), $ cause ->getCode (), $ cause ->getConstraint ());
138
+
139
+ $ errorData ['trace ' ][] = $ this ->cloneVar ($ levelCause );
129
140
141
+ if ($ cause instanceof ConstraintViolationInterface) {
130
142
$ cause = method_exists ($ cause , 'getCause ' ) ? $ cause ->getCause () : null ;
131
143
132
144
continue ;
133
145
}
134
146
135
147
if ($ cause instanceof \Exception) {
136
- $ errorData ['trace ' ][] = array (
137
- 'class ' => $ this ->valueExporter ->exportValue (get_class ($ cause )),
138
- 'message ' => $ this ->valueExporter ->exportValue ($ cause ->getMessage ()),
139
- );
140
-
141
- $ cause = $ cause ->getPrevious ();
148
+ $ cause = $ this ->cloneVar ($ cause ->getPrevious ());
142
149
143
150
continue ;
144
151
}
145
152
146
- $ errorData ['trace ' ][] = $ cause ;
147
-
148
153
break ;
149
154
}
150
155
151
156
$ data ['errors ' ][] = $ errorData ;
152
157
}
153
158
154
- $ data ['synchronized ' ] = $ this ->valueExporter -> exportValue ($ form ->isSynchronized ());
159
+ $ data ['synchronized ' ] = $ this ->cloneVar ($ form ->isSynchronized ());
155
160
156
161
return $ data ;
157
162
}
@@ -174,7 +179,7 @@ public function extractViewVariables(FormView $view)
174
179
}
175
180
176
181
foreach ($ view ->vars as $ varName => $ value ) {
177
- $ data ['view_vars ' ][$ varName ] = $ this ->valueExporter -> exportValue ($ value );
182
+ $ data ['view_vars ' ][$ varName ] = $ this ->cloneVar ($ value );
178
183
}
179
184
180
185
ksort ($ data ['view_vars ' ]);
@@ -199,4 +204,24 @@ private function buildId(FormInterface $form)
199
204
200
205
return $ id ;
201
206
}
207
+
208
+ /**
209
+ * Converts the variable into a serializable Data instance.
210
+ *
211
+ * This array can be displayed in the template using
212
+ * the VarDumper component.
213
+ *
214
+ * @param mixed $var
215
+ *
216
+ * @return Data
217
+ */
218
+ private function cloneVar ($ var )
219
+ {
220
+ $ traceArgs = ExceptionCaster::$ traceArgs ;
221
+ ExceptionCaster::$ traceArgs = false ;
222
+ $ data = $ this ->varCloner ->cloneVar ($ var );
223
+ ExceptionCaster::$ traceArgs = $ traceArgs ;
224
+
225
+ return $ data ;
226
+ }
202
227
}
0 commit comments