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

Skip to content

Commit 42ef705

Browse files
committed
improve BC layer
1 parent e134e68 commit 42ef705

File tree

2 files changed

+97
-8
lines changed

2 files changed

+97
-8
lines changed

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

Lines changed: 36 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,37 @@ 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+
return;
73+
}
74+
75+
trigger_deprecation('symfony/form', '6.4', 'Calling "%s()" is deprecated, use "%s::postSetData()" instead.', __METHOD__, __CLASS__);
76+
// parent::preSetData() has been called
77+
$this->overridden = false;
78+
$this->postSetData($event);
79+
$this->usePreSetData = true;
80+
}
81+
82+
// Remove FormEvent type hint in 7.0
83+
final public function postSetData(FormEvent|PostSetDataEvent $event): void
84+
{
85+
if (static::class !== __CLASS__) {
86+
if ($this->overridden) {
87+
trigger_deprecation('symfony/form', '6.4', 'Calling "%s::preSetData()" is deprecated, use "%s::postSetData()" instead.', static::class, __CLASS__);
88+
// parent::preSetData() has not been called, noop
89+
90+
return;
91+
}
92+
93+
if ($this->usePreSetData) {
94+
// nothing else to do
95+
return;
96+
}
97+
}
98+
6399
$form = $event->getForm();
64100
$data = $event->getData() ?? [];
65101

@@ -80,11 +116,6 @@ public function preSetData(FormEvent $event)
80116
}
81117
}
82118

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

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

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

51+
/**
52+
* @group legacy
53+
*/
5154
public function testPreSetDataResizesForm()
5255
{
5356
$this->form->add($this->getForm('0'));
5457
$this->form->add($this->getForm('1'));
5558

5659
$data = [1 => 'string', 2 => 'string'];
5760
$event = new FormEvent($this->form, $data);
58-
$listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], false, false);
61+
$listener = new class(TextType::class, ['attr' => ['maxlength' => 10]], false, false) extends ResizeFormListener {
62+
public function preSetData(FormEvent $event)
63+
{
64+
parent::preSetData($event);
65+
}
66+
};
5967
$listener->preSetData($event);
6068

6169
$this->assertFalse($this->form->has('0'));
6270
$this->assertTrue($this->form->has('1'));
6371
$this->assertTrue($this->form->has('2'));
6472
}
6573

74+
public function testPostSetDataResizesForm()
75+
{
76+
$this->form->add($this->getForm('0'));
77+
$this->form->add($this->getForm('1'));
78+
79+
$data = [1 => 'string', 2 => 'string'];
80+
$event = new FormEvent($this->form, $data);
81+
$listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], false, false);
82+
$listener->postSetData($event);
83+
84+
$this->assertFalse($this->form->has('0'));
85+
$this->assertTrue($this->form->has('1'));
86+
$this->assertTrue($this->form->has('2'));
87+
}
88+
89+
/**
90+
* @group legacy
91+
*/
6692
public function testPreSetDataRequiresArrayOrTraversable()
6793
{
6894
$this->expectException(UnexpectedTypeException::class);
6995
$data = 'no array or traversable';
7096
$event = new FormEvent($this->form, $data);
71-
$listener = new ResizeFormListener('text', [], false, false);
97+
$listener = new class('text', [], false, false) extends ResizeFormListener {
98+
public function preSetData(FormEvent $event)
99+
{
100+
parent::preSetData($event);
101+
}
102+
};
72103
$listener->preSetData($event);
73104
}
74105

106+
public function testPostSetDataRequiresArrayOrTraversable()
107+
{
108+
$this->expectException(UnexpectedTypeException::class);
109+
$data = 'no array or traversable';
110+
$event = new FormEvent($this->form, $data);
111+
$listener = new ResizeFormListener('text', [], false, false);
112+
$listener->postSetData($event);
113+
}
114+
115+
/**
116+
* @group legacy
117+
*/
75118
public function testPreSetDataDealsWithNullData()
76119
{
77120
$data = null;
78121
$event = new FormEvent($this->form, $data);
79-
$listener = new ResizeFormListener(TextType::class, [], false, false);
122+
$listener = new class(TextType::class, [], false, false) extends ResizeFormListener {
123+
public function preSetData(FormEvent $event)
124+
{
125+
parent::preSetData($event);
126+
}
127+
};
80128
$listener->preSetData($event);
81129

82130
$this->assertSame(0, $this->form->count());
83131
}
84132

133+
public function testPostSetDataDealsWithNullData()
134+
{
135+
$data = null;
136+
$event = new FormEvent($this->form, $data);
137+
$listener = new ResizeFormListener(TextType::class, [], false, false);
138+
$listener->postSetData($event);
139+
140+
$this->assertSame(0, $this->form->count());
141+
}
142+
85143
public function testPreSubmitResizesUpIfAllowAdd()
86144
{
87145
$this->form->add($this->getForm('0'));

0 commit comments

Comments
 (0)
0