Skip to content

Commit a7d3ff7

Browse files
dkd-friedrichclaude
authored andcommitted
[!!!][TASK] Introduce RecordInsertedEvent, drop remove isNewRecord from RecordUpdatedEvent
The deprecated $isNewRecord property, constructor parameter and isNewRecord() method are removed from RecordUpdatedEvent. A new RecordInsertedEvent is introduced for record creations; RecordMonitor now dispatches it upon record creation. All three event listeners and Services.yaml are updated accordingly. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent d78df5d commit a7d3ff7

9 files changed

Lines changed: 131 additions & 34 deletions

File tree

Classes/Domain/Index/Queue/UpdateHandler/EventListener/ImmediateProcessingEventListener.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\PageMovedEvent;
2525
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordDeletedEvent;
2626
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordGarbageCheckEvent;
27+
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent;
2728
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent;
2829
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent;
2930
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\VersionSwappedEvent;
@@ -110,6 +111,26 @@ protected function handleRecordMovedEvent(RecordMovedEvent $event): void
110111
}
111112
}
112113

114+
/**
115+
* Handles record insertions
116+
*
117+
* @throws DBALException
118+
* @throws UnexpectedTYPO3SiteInitializationException
119+
* @throws RootPageRecordNotFoundException
120+
*
121+
* @noinspection PhpUnused
122+
*/
123+
protected function handleRecordInsertedEvent(RecordInsertedEvent $event): void
124+
{
125+
if ($event->isContentElementUpdate()) {
126+
$this->getDataUpdateHandler()->handleContentElementUpdate($event->getUid(), $event->getFields());
127+
} elseif ($event->isPageUpdate()) {
128+
$this->getDataUpdateHandler()->handlePageUpdate($event->getUid(), $event->getFields());
129+
} else {
130+
$this->getDataUpdateHandler()->handleRecordUpdate($event->getUid(), $event->getTable());
131+
}
132+
}
133+
113134
/**
114135
* Handles record updates
115136
*
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of the TYPO3 CMS project.
7+
*
8+
* It is free software; you can redistribute it and/or modify it under
9+
* the terms of the GNU General Public License, either version 2
10+
* of the License, or any later version.
11+
*
12+
* For the full copyright and license information, please read the
13+
* LICENSE.txt file that was distributed with this source code.
14+
*
15+
* The TYPO3 project - inspiring people to share!
16+
*/
17+
18+
namespace ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events;
19+
20+
/**
21+
* Event fired if a record is created
22+
*/
23+
class RecordInsertedEvent extends AbstractDataUpdateEvent {}

Classes/Domain/Index/Queue/UpdateHandler/Events/RecordUpdatedEvent.php

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,6 @@
1818
namespace ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events;
1919

2020
/**
21-
* Event fired if a record is created or updated
21+
* Event fired if a record is updated
2222
*/
23-
class RecordUpdatedEvent extends AbstractDataUpdateEvent
24-
{
25-
/**
26-
* @deprecated For compatibility reasons flag "$isNewRecord" is added to RecordUpdatedEvent,
27-
* in v14 a separate RecordInsertedEvent will be used
28-
*/
29-
protected bool $isNewRecord;
30-
31-
public function __construct(
32-
int $uid,
33-
string $table,
34-
array $fields = [],
35-
bool $frontendGroupsRemoved = false,
36-
bool $isNewRecord = false,
37-
) {
38-
parent::__construct($uid, $table, $fields, $frontendGroupsRemoved);
39-
$this->isNewRecord = $isNewRecord;
40-
}
41-
42-
/**
43-
* @deprecated For compatibility reasons flag "$isNewRecord" is added to RecordUpdatedEvent,
44-
* in v14 a separate RecordInsertedEvent will be used
45-
*/
46-
final public function isNewRecord(): bool
47-
{
48-
return $this->isNewRecord;
49-
}
50-
}
23+
class RecordUpdatedEvent extends AbstractDataUpdateEvent {}

Classes/IndexQueue/RecordMonitor.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
namespace ApacheSolrForTypo3\Solr\IndexQueue;
1919

2020
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\ContentElementDeletedEvent;
21+
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent;
2122
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent;
2223
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent;
2324
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\VersionSwappedEvent;
@@ -164,12 +165,12 @@ public function processDatamap_afterDatabaseOperations(
164165
return;
165166
}
166167

168+
$eventClass = $status === 'new' ? RecordInsertedEvent::class : RecordUpdatedEvent::class;
167169
$this->eventDispatcher->dispatch(
168-
new RecordUpdatedEvent(
170+
new $eventClass(
169171
(int)$recordUid,
170172
$table,
171173
$fields,
172-
isNewRecord: ($status === 'new' ? true : false),
173174
),
174175
);
175176
}

Configuration/Services.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ services:
146146
identifier: 'solr.index.updatehandler.noprocessingeventlistener'
147147
before: 'solr.index.updatehandler.immediateprocessingeventlistener,solr.index.updatehandler.delayedprocessingeventlistener'
148148
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent
149+
- name: event.listener
150+
identifier: 'solr.index.updatehandler.noprocessingeventlistener'
151+
before: 'solr.index.updatehandler.immediateprocessingeventlistener,solr.index.updatehandler.delayedprocessingeventlistener'
152+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent
149153
- name: event.listener
150154
identifier: 'solr.index.updatehandler.noprocessingeventlistener'
151155
before: 'solr.index.updatehandler.immediateprocessingeventlistener,solr.index.updatehandler.delayedprocessingeventlistener'
@@ -180,6 +184,10 @@ services:
180184
identifier: 'solr.index.updatehandler.immediateprocessingeventlistener'
181185
before: 'solr.index.updatehandler.delayedprocessingeventlistener'
182186
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent
187+
- name: event.listener
188+
identifier: 'solr.index.updatehandler.immediateprocessingeventlistener'
189+
before: 'solr.index.updatehandler.delayedprocessingeventlistener'
190+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent
183191
- name: event.listener
184192
identifier: 'solr.index.updatehandler.immediateprocessingeventlistener'
185193
before: 'solr.index.updatehandler.delayedprocessingeventlistener'
@@ -212,6 +220,9 @@ services:
212220
- name: event.listener
213221
identifier: 'solr.index.updatehandler.delayedprocessingeventlistener'
214222
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent
223+
- name: event.listener
224+
identifier: 'solr.index.updatehandler.delayedprocessingeventlistener'
225+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent
215226
- name: event.listener
216227
identifier: 'solr.index.updatehandler.delayedprocessingeventlistener'
217228
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent

Documentation/Releases/solr-release-14-0.rst

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,45 @@ Rename method :php:`isPageIndexable` to :php:`isPageEnabled()` and adjust the si
9494
(the page record) instead of an :php:`Item` object:
9595

9696

97+
!!! RecordUpdatedEvent no longer covers record insertions – use RecordInsertedEvent
98+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
99+
100+
A dedicated :php:`RecordInsertedEvent` has been introduced for record creations.
101+
The :php:`RecordUpdatedEvent` now only fires for updates; the deprecated
102+
:php:`$isNewRecord` property, its constructor parameter, and the :php:`isNewRecord()`
103+
method have been removed from :php:`RecordUpdatedEvent`.
104+
105+
Previously :php:`RecordUpdatedEvent` was dispatched for both new records and updates,
106+
with :php:`isNewRecord()` acting as a flag to distinguish the two cases.
107+
In v14 these are two distinct events.
108+
109+
Impact
110+
""""""
111+
112+
**Listeners checking** :php:`$event->isNewRecord()`
113+
114+
Register your listener for :php:`RecordInsertedEvent` to handle creations, and for
115+
:php:`RecordUpdatedEvent` to handle updates. Remove any :php:`isNewRecord()` checks:
116+
117+
.. code-block:: yaml
118+
119+
# Before – one listener covering both cases
120+
tags:
121+
- name: event.listener
122+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent
123+
124+
# After – separate registrations
125+
tags:
126+
- name: event.listener
127+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent
128+
- name: event.listener
129+
event: ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent
130+
131+
**Code instantiating** :php:`new RecordUpdatedEvent(..., isNewRecord: true)`
132+
133+
Replace with :php:`new RecordInsertedEvent($uid, $table, $fields)`.
134+
135+
97136
All Changes
98137
-----------
99138

Tests/Unit/Domain/Index/Queue/UpdateHandler/EventListener/ImmediateProcessingEventListenerTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\PageMovedEvent;
2424
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordDeletedEvent;
2525
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordGarbageCheckEvent;
26+
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent;
2627
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent;
2728
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent;
2829
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\VersionSwappedEvent;
@@ -131,6 +132,7 @@ public static function canHandleEventsDataProvider(): Traversable
131132
yield [ContentElementDeletedEvent::class, DataUpdateHandler::class, [1], true];
132133
yield [VersionSwappedEvent::class, DataUpdateHandler::class, [1, 'pages'], true];
133134
yield [RecordMovedEvent::class, DataUpdateHandler::class, [1, 'pages'], true];
135+
yield [RecordInsertedEvent::class, DataUpdateHandler::class, [1, 'pages'], true];
134136
yield [RecordUpdatedEvent::class, DataUpdateHandler::class, [1, 'pages'], true];
135137
yield [RecordDeletedEvent::class, GarbageHandler::class, [1, 'pages'], true];
136138
yield [PageMovedEvent::class, GarbageHandler::class, [1], true];
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the TYPO3 CMS project.
5+
*
6+
* It is free software; you can redistribute it and/or modify it under
7+
* the terms of the GNU General Public License, either version 2
8+
* of the License, or any later version.
9+
*
10+
* For the full copyright and license information, please read the
11+
* LICENSE.txt file that was distributed with this source code.
12+
*
13+
* The TYPO3 project - inspiring people to share!
14+
*/
15+
16+
namespace ApacheSolrForTypo3\Solr\Tests\Unit\Domain\Index\Queue\UpdateHandler\Events;
17+
18+
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent;
19+
20+
/**
21+
* Testcase for the RecordInsertedEvent
22+
*/
23+
class RecordInsertedEventTest extends SetUpDataUpdateEvent
24+
{
25+
protected const EVENT_CLASS = RecordInsertedEvent::class;
26+
protected const EVENT_TEST_TABLE = 'tx_foo_bar';
27+
}

Tests/Unit/IndexQueue/RecordMonitorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
namespace ApacheSolrForTypo3\Solr\Tests\Unit\IndexQueue;
1717

1818
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\ContentElementDeletedEvent;
19+
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordInsertedEvent;
1920
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordMovedEvent;
20-
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\RecordUpdatedEvent;
2121
use ApacheSolrForTypo3\Solr\Domain\Index\Queue\UpdateHandler\Events\VersionSwappedEvent;
2222
use ApacheSolrForTypo3\Solr\IndexQueue\RecordMonitor;
2323
use ApacheSolrForTypo3\Solr\System\Configuration\ExtensionConfiguration;
@@ -191,7 +191,7 @@ public function processDatamap_afterDatabaseOperationsUsesAlreadyResolvedNextAut
191191
});
192192
$this->recordMonitor->processDatamap_afterDatabaseOperations('new', 'tt_content', 4711, ['pid' => 1], $dataHandlerMock);
193193

194-
self::assertTrue($dispatchedEvent instanceof RecordUpdatedEvent);
194+
self::assertTrue($dispatchedEvent instanceof RecordInsertedEvent);
195195
self::assertEquals('tt_content', $dispatchedEvent->getTable());
196196
self::assertEquals(4711, $dispatchedEvent->getUid());
197197
}
@@ -213,7 +213,7 @@ public function processDatamap_afterDatabaseOperationsUsesNotYetResolvedNextAuto
213213

214214
$this->recordMonitor->processDatamap_afterDatabaseOperations('new', 'tt_content', $newId, ['pid' => 1], $dataHandlerMock);
215215

216-
self::assertTrue($dispatchedEvent instanceof RecordUpdatedEvent);
216+
self::assertTrue($dispatchedEvent instanceof RecordInsertedEvent);
217217
self::assertEquals('tt_content', $dispatchedEvent->getTable());
218218
self::assertEquals(123, $dispatchedEvent->getUid());
219219
}

0 commit comments

Comments
 (0)