8000 [Form] Used direct method access in MergeCollectionListener instead o… · Olajide/symfony@b393774 · GitHub
[go: up one dir, main page]

Skip to content

Commit b393774

Browse files
committed
[Form] Used direct method access in MergeCollectionListener instead of Reflection to avoid problems when using class hierarchies
1 parent d208f4e commit b393774

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed

src/Symfony/Component/Form/Extension/Core/EventListener/MergeCollectionListener.php

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ public function onBindNormData(FilterDataEvent $event)
8080
$form = $event->getForm();
8181
$data = $event->getData();
8282
$parentData = $form->hasParent() ? $form->getParent()->getData() : null;
83-
$adder = null;
84-
$remover = null;
83+
$adderName = null;
84+
$removerName = null;
8585

8686
if (null === $data) {
8787
$data = array();
@@ -102,36 +102,34 @@ public function onBindNormData(FilterDataEvent $event)
102102
$reflClass = new \ReflectionClass($parentData);
103103

104104
foreach ($singulars as $singular) {
105-
$adderName = $this->adderPrefix . $singular;
106-
$removerName = $this->removerPrefix . $singular;
105+
$maybeAdderName = $this->adderPrefix . $singular;
106+
$maybeRemoverName = $this->removerPrefix . $singular;
107107

108-
if ($this->allowAdd && $reflClass->hasMethod($adderName)) {
109-
$adder = $reflClass->getMethod($adderName);
108+
if ($this->allowAdd && $reflClass->hasMethod($maybeAdderName)) {
109+
$adder = $reflClass->getMethod($maybeAdderName);
110110

111-
if (!$adder->isPublic() || $adder->getNumberOfRequiredParameters() !== 1) {
112-
// False alert
113-
$adder = null;
111+
if ($adder->isPublic() && $adder->getNumberOfRequiredParameters() === 1) {
112+
$adderName = $maybeAdderName;
114113
}
115114
}
116115

117-
if ($this->allowDelete && $reflClass->hasMethod($removerName)) {
118-
$remover = $reflClass->getMethod($removerName);
116+
if ($this->allowDelete && $reflClass->hasMethod($maybeRemoverName)) {
117+
$remover = $reflClass->getMethod($maybeRemoverName);
119118

120-
if (!$remover->isPublic() || $remover->getNumberOfRequiredParameters() !== 1) {
121-
// False alert
122-
$remover = null;
119+
if ($remover->isPublic() && $remover->getNumberOfRequiredParameters() === 1) {
120+
$removerName = $maybeRemoverName;
123121
}
124122
}
125123

126124
// When we want to both add and delete, we look for an adder and
127125
// remover with the same name
128-
if (!($this->allowAdd && !$adder) && !($this->allowDelete && !$remover)) {
126+
if (!($this->allowAdd && !$adderName) && !($this->allowDelete && !$removerName)) {
129127
break;
130128
}
131129

132130
// False alert
133-
$adder = null;
134-
$remover = null;
131+
$adderName = null;
132+
$removerName = null;
135133
}
136134
}
137135

@@ -155,17 +153,17 @@ public function onBindNormData(FilterDataEvent $event)
155153
}
156154
}
157155

158-
if ($adder || $remover) {
156+
if ($adderName || $removerName) {
159157
// If methods to add and to remove exist, call them now, if allowed
160-
if ($remover) {
158+
if ($removerName) {
161159
foreach ($itemsToDelete as $item) {
162-
$remover->invoke($parentData, $item);
160+
$parentData->$removerName($item);
163161
}
164162
}
165163

166-
if ($adder) {
164+
if ($adderName) {
167165
foreach ($itemsToAdd as $item) {
168-
$adder->invoke($parentData, $item);
166+
$parentData->$adderName($item);
169167
}
170168
}
171169
} elseif (!$originalData) {

0 commit comments

Comments
 (0)
0