8000 improve BC layer · symfony/symfony@ba36dd3 · GitHub
[go: up one dir, main page]

Skip to content

Commit ba36dd3

Browse files
committed
improve BC layer
1 parent a86c8ff commit ba36dd3

File tree

2 files changed

+96
-8
lines changed

2 files changed

+96
-8
lines changed

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

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class ResizeFormListener implements EventSubscriberInterface
3333

3434
private \Closure|bool $deleteEmpty;
3535

36+
// BC, to be removed in 7.0
37+
private bool $overridden = true;
38+
private bool $usePreSetData = false;
39+
3640
public function __construct(string $type, array $options = [], bool $allowAdd = false, bool $allowDelete = false, bool|callable $deleteEmpty = false, array $prototypeOptions = null)
3741
{
3842
$this->type = $type;
@@ -46,6 +50,7 @@ public function __construct(string $type, array $options = [], bool $allowAdd =
4650
public static function getSubscribedEvents(): array
4751
{
4852
return [
53+
FormEvents::PRE_SET_DATA => 'preSetData', // deprecated
4954
FormEvents::POST_SET_DATA => ['postSetData', 255], // as early as possible
5055
FormEvents::PRE_SUBMIT => 'preSubmit',
5156
// (MergeCollectionListener, MergeDoctrineCollectionListener)
@@ -60,6 +65,36 @@ public static function getSubscribedEvents(): array
6065
*/
6166
public function preSetData(FormEvent $event)
6267
{
68+
if (__CLASS__ === static::class
69+
|| __CLASS__ === (new \ReflectionClass($this))->getMethod('preSetData')->getDeclaringClass()->name
70+
) {
71+
// not a child class, or child class does not overload PRE_SET_DATA
72+
} else {
73+
trigger_deprecation('symfony/form', '6.4', 'Calling "%s()" is deprecated, use "%s::postSetData()" instead.', __METHOD__, __CLASS__);
74+
// parent::preSetData() has been called
75+
$this->overridden = false;
76+
$this->postSetData($event);
77+
$this->usePreSetData = true;
78+
}
79+
}
80+
81+
// Remove FormEvent type hint in 7.0
82+
final public function postSetData(FormEvent|PostSetDataEvent $event): void
83+
{
84+
if (static::class !== __CLASS__) {
85+
if ($this->overridden) {
86+
trigger_deprecation('symfony/form', '6.4', 'Calling "%s::preSetData()" is deprecated, use "%s::postSetData()" instead.', static::class, __CLASS__);
87+
// parent::preSetData() has not been called, noop
88+
89+
return;
90+
}
91+
92+
if ($this->usePreSetData) {
93+
// nothing else to do
94+
return;
95+
}
96+
}
97+
6398
$form = $event->getForm();
6499
$data = $event->getData() ?? [];
65100

@@ -80,11 +115,6 @@ public function preSetData(FormEvent $event)
80115
}
81116
}
82117

83-
public function postSetData(PostSetDataEvent $event): void
84-
{
85-
$this->preSetData($event);
86-
}
87-
88118
/**
89119
* @return void
90120
*/

src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,40 +52,98 @@ protected function getForm($name = 'name')
5252
return $this->getBuilder($name)->getForm();
5353
}
5454

55+
/**
56+
* @group legacy
57+
*/
5558
public function testPreSetDataResizesForm()
5659
{
5760
$this->form->add($this->getForm('0'));
5861
$this->form->add($this->getForm('1'));
5962

6063
$data = [1 => 'string', 2 => 'string'];
6164
$event = new FormEvent($this->form, $data);
62-
$listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], false, false);
65+
$listener = new class(TextType::class, ['attr' => ['maxlength' => 10]], false, false) extends ResizeFormListener {
66+
public function preSetData(FormEvent $event)
67+
{
68+
parent::preSetData($event);
69+
}
70+
};
6371
$listener->preSetData($event);
6472

6573
$this->assertFalse($this->form->has('0'));
6674
$this->assertTrue($this->form->has('1'));
6775
$this->assertTrue($this->form->has('2'));
6876
}
6977

78+
public function testPostSetDataResizesForm()
79+
{
80+
$this->form->add($this->getForm('0'));
81+
$this->form->add($this->getForm('1'));
82+
83+
$data = [1 => 'string', 2 => 'string'];
84+
$event = new FormEvent($this->form, $data);
85+
$listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], false, false);
86+
$listener->postSetData($event);
87+
88+
$this->assertFalse($this->form->has('0'));
89+
$this->assertTrue($this->form->has('1'));
90+
$this->assertTrue($this->form->has('2'));
91+
}
92+
93+
/**
94+
* @group legacy
95+
*/
7096
public function testPreSetDataRequiresArrayOrTraversable()
7197
{
7298
$this->expectException(UnexpectedTypeException::class);
7399
$data = 'no array or traversable';
74100
$event = new FormEvent($this->form, $data);
75-
$listener = new ResizeFormListener('text', [], false, false);
101+
$listener = new class('text', [], false, false) extends ResizeFormListener {
102+
public function preSetData(FormEvent $event)
103+
{
104+
parent::preSetData($event);
105+
}
106+
};
76107
$listener->preSetData($event);
77108
}
78109

110+
public function testPostSetDataRequiresArrayOrTraversable()
111+
{
112+
$this->expectException(UnexpectedTypeException::class);
113+
$data = 'no array or traversable';
114+
$event = new FormEvent($this->form, $data);
115+
$listener = new ResizeFormListener('text', [], false, false);
116+
$listener->postSetData($event);
117+
}
118+
119+
/**
120+
* @group legacy
121+
*/
79122
public function testPreSetDataDealsWithNullData()
80123
{
81124
$data = null;
82125
$event = new FormEvent($this->form, $data);
83-
$listener = new ResizeFormListener(TextType::class, [], false, false);
126+
$listener = new class(TextType::class, [], false, false) extends ResizeFormListener {
127+
public function preSetData(FormEvent $event)
128+
{
129+
parent::preSetData($event);
130+
}
131+
};
84132
$listener->preSetData($event);
85133

86134
$this->assertSame(0, $this->form->count());
87135
}
88136

137+
public function testPostSetDataDealsWithNullData()
138+
{
139+
$data = null;
140+
$event = new FormEvent($this->form, $data);
141+
$listener = new ResizeFormListener(TextType::class, [], false, false);
142+
$listener->postSetData($event);
143+
144+
$this->assertSame(0, $this->form->count());
145+
}
146+
89147
public function testPreSubmitResizesUpIfAllowAdd()
90148
{
91149
$this->form->add($this->getForm('0'));

0 commit comments

Comments
 (0)
0