Skip to content

Commit 1baeaf6

Browse files
committed
PagesTable 等の beforeSave や、afterSave が動作しない問題を改善
1 parent 990a3d5 commit 1baeaf6

File tree

2 files changed

+56
-39
lines changed

2 files changed

+56
-39
lines changed

plugins/baser-core/src/Utility/BcUtil.php

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,12 +1641,23 @@ public static function fgetcsvReg(&$handle, $length = null, $d = ',', $e = '"')
16411641
*/
16421642
public static function offEvent(EventManagerInterface $eventManager, string $eventKey)
16431643
{
1644-
$eventListeners = $eventManager->listeners($eventKey);
16451644
$globalEventManager = $eventManager->instance();
1646-
if ($eventListeners) {
1647-
foreach($eventListeners as $eventListener) {
1648-
$eventManager->off($eventKey, $eventListener['callable']);
1649-
$globalEventManager->off($eventKey, $eventListener['callable']);
1645+
$eventListeners = [
1646+
'local' => $eventManager->prioritisedListeners($eventKey),
1647+
'global' => $globalEventManager->prioritisedListeners($eventKey)
1648+
];
1649+
if ($eventListeners['local']) {
1650+
foreach($eventListeners['local'] as $listeners) {
1651+
foreach($listeners as $listener) {
1652+
$eventManager->off($eventKey, $listener['callable']);
1653+
}
1654+
}
1655+
}
1656+
if ($eventListeners['global']) {
1657+
foreach($eventListeners['global'] as $listeners) {
1658+
foreach($listeners as $listener) {
1659+
$globalEventManager->off($eventKey, $listener['callable']);
1660+
}
16501661
}
16511662
}
16521663
return $eventListeners;
@@ -1656,16 +1667,26 @@ public static function offEvent(EventManagerInterface $eventManager, string $eve
16561667
* イベントをオンにする
16571668
* @param EventManagerInterface $eventManager
16581669
* @param string $eventKey
1659-
* @param EventListenerInterface[] $eventListeners
1670+
* @param array $eventListeners
16601671
* @checked
16611672
* @noTodo
16621673
* @unitTest
16631674
*/
16641675
public static function onEvent(EventManagerInterface $eventManager, string $eventKey, array $eventListeners)
16651676
{
1666-
if ($eventListeners) {
1667-
foreach($eventListeners as $eventListener) {
1668-
$eventManager->on($eventKey, $eventListener['callable']);
1677+
$globalEventManager = $eventManager->instance();
1678+
if (!empty($eventListeners['local'])) {
1679+
foreach($eventListeners['local'] as $priority => $listeners) {
1680+
foreach($listeners as $listener) {
1681+
$eventManager->on($eventKey, ['priority' => $priority], $listener['callable']);
1682+
}
1683+
}
1684+
}
1685+
if (!empty($eventListeners['global'])) {
1686+
foreach($eventListeners['global'] as $priority => $listeners) {
1687+
foreach($listeners as $listener) {
1688+
$globalEventManager->on($eventKey, ['priority' => $priority], $listener['callable']);
1689+
}
16691690
}
16701691
}
16711692
}

plugins/baser-core/tests/TestCase/Utility/BcUtilTest.php

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,36 +1204,32 @@ public static function fgetcsvRegDataProvider()
12041204
*/
12051205
public function testOnEventOffEvent(): void
12061206
{
1207-
//offEventをテスト
1208-
$eventManager = $this->getTableLocator()->get('BcBlog.BlogPosts')->getEventManager();
1209-
$beforeSaveListeners = BcUtil::offEvent($eventManager, 'Model.beforeMarshal');
1210-
//戻り値を確認
1211-
$this->assertCount(1, $beforeSaveListeners);
1212-
//eventがOFFしたかどうか確認
1213-
$listeners = $eventManager->listeners('Model.beforeMarshal');
1214-
$this->assertCount(0, $listeners);
1215-
1216-
//onEventをテスト
1217-
BcUtil::onEvent($eventManager, 'Model.beforeMarshal', $beforeSaveListeners);
1218-
//eventがONしたかどうか確認
1219-
$listeners = $eventManager->listeners('Model.beforeMarshal');
1220-
$this->assertCount(1, $listeners);
1221-
$this->assertEquals($beforeSaveListeners, $listeners);
1222-
}
1223-
1224-
/**
1225-
* test retry
1226-
*/
1227-
public function testRetry()
1228-
{
1229-
//正常実行
1230-
$rs = BcUtil::retry(1, function () {return 2;}, 3);
1231-
$this->assertEquals(2, $rs);
1232-
1233-
//異常実行
1234-
$this->expectException(\InvalidArgumentException::class);
1235-
$this->expectExceptionMessage('リトライ回数は正の整数値で指定してください。');
1236-
BcUtil::retry(-1, function () {return 0;}, 1);
1207+
$eventManager = EventManager::instance();
1208+
$eventKey = 'testOnEvent';
1209+
$bcEvenListener = new class extends BcEventListener {
1210+
public $events = ['event1'];
1211+
public $layer = 'Controller';
1212+
public function event1() {
1213+
return 'event1';
1214+
}
1215+
};
1216+
// onEvent() でイベントを設定
1217+
BcUtil::onEvent($eventManager, $eventKey, [
1218+
'local' => [
1219+
10 => [
1220+
['callable' => [$bcEvenListener, 'event1']]
1221+
]
1222+
]
1223+
]);
1224+
// listeners() イベントの登録を確認
1225+
$listeners = $eventManager->listeners($eventKey);
1226+
$this->assertIsCallable($listeners[0]['callable']);
1227+
1228+
// offEvent() でイベントを解除
1229+
BcUtil::offEvent($eventManager, $eventKey);
1230+
// listeners() イベントの解除を確認
1231+
$listeners = $eventManager->listeners($eventKey);
1232+
$this->assertEmpty($listeners);
12371233
}
12381234

12391235
/**

0 commit comments

Comments
 (0)