From a13eca13664c3cd1169def880c31b92f704a7b54 Mon Sep 17 00:00:00 2001 From: Joris Vaesen Date: Mon, 24 Mar 2025 15:13:53 +0100 Subject: [PATCH 1/6] Make NullEngine return the original keys with the default as other cache engines do --- src/Cache/Engine/NullEngine.php | 8 ++- .../TestCase/Cache/Engine/NullEngineTest.php | 68 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/TestCase/Cache/Engine/NullEngineTest.php diff --git a/src/Cache/Engine/NullEngine.php b/src/Cache/Engine/NullEngine.php index 4612a276b2f..89defe46792 100644 --- a/src/Cache/Engine/NullEngine.php +++ b/src/Cache/Engine/NullEngine.php @@ -62,7 +62,13 @@ public function get($key, $default = null) */ public function getMultiple($keys, $default = null): iterable { - return []; + $result = []; + + foreach ($keys as $key) { + $result[$key] = $default; + } + + return $result; } /** diff --git a/tests/TestCase/Cache/Engine/NullEngineTest.php b/tests/TestCase/Cache/Engine/NullEngineTest.php new file mode 100644 index 00000000000..417ae9e33f2 --- /dev/null +++ b/tests/TestCase/Cache/Engine/NullEngineTest.php @@ -0,0 +1,68 @@ + NullEngine::class, + ]); + } + + public function testReadMany(): void + { + $keys = [ + 'key1', + 'key2', + 'key3', + ]; + + $result1 = Cache::readMany($keys, 'null'); + + $this->assertSame([ + 'key1' => null, + 'key2' => null, + 'key3' => null, + ], $result1); + + $e = new \Exception('Cache key not found'); + $result2 = Cache::pool('null')->getMultiple($keys, $e); + + $this->assertSame([ + 'key1' => $e, + 'key2' => $e, + 'key3' => $e, + ], $result2); + } +} From 35a05a7a049778beb036640dbb0987e428ba99e6 Mon Sep 17 00:00:00 2001 From: Joris Vaesen Date: Mon, 24 Mar 2025 15:27:58 +0100 Subject: [PATCH 2/6] Simplify import --- tests/TestCase/Cache/Engine/NullEngineTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/TestCase/Cache/Engine/NullEngineTest.php b/tests/TestCase/Cache/Engine/NullEngineTest.php index 417ae9e33f2..3bc67c58771 100644 --- a/tests/TestCase/Cache/Engine/NullEngineTest.php +++ b/tests/TestCase/Cache/Engine/NullEngineTest.php @@ -18,6 +18,7 @@ use Cake\Cache\Cache; use Cake\Cache\Engine\NullEngine; use Cake\TestSuite\TestCase; +use Exception; /** * ArrayEngineTest class @@ -56,7 +57,7 @@ public function testReadMany(): void 'key3' => null, ], $result1); - $e = new \Exception('Cache key not found'); + $e = new Exception('Cache key not found'); $result2 = Cache::pool('null')->getMultiple($keys, $e); $this->assertSame([ From d02bc6eec8100ab4fc248b58b56de5cb06138ba7 Mon Sep 17 00:00:00 2001 From: Joris Vaesen Date: Sat, 29 Mar 2025 18:03:24 +0100 Subject: [PATCH 3/6] Backport: Treat null as a valid cache value on MemcachedEngine::getMultiple (#18254) Treat null as a valid cache value on MemcachedEngine::getMultiple --- src/Cache/Engine/MemcachedEngine.php | 2 +- .../Cache/Engine/MemcachedEngineTest.php | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Cache/Engine/MemcachedEngine.php b/src/Cache/Engine/MemcachedEngine.php index 29c56954a4a..687987603bb 100644 --- a/src/Cache/Engine/MemcachedEngine.php +++ b/src/Cache/Engine/MemcachedEngine.php @@ -365,7 +365,7 @@ public function getMultiple($keys, $default = null): array $values = $this->_Memcached->getMulti($cacheKeys); $return = []; foreach ($cacheKeys as $original => $prefixed) { - $return[$original] = $values[$prefixed] ?? $default; + $return[$original] = array_key_exists($prefixed, $values) ? $values[$prefixed] : $default; } return $return; diff --git a/tests/TestCase/Cache/Engine/MemcachedEngineTest.php b/tests/TestCase/Cache/Engine/MemcachedEngineTest.php index f787604c208..c9524ed1d0f 100644 --- a/tests/TestCase/Cache/Engine/MemcachedEngineTest.php +++ b/tests/TestCase/Cache/Engine/MemcachedEngineTest.php @@ -21,6 +21,7 @@ use Cake\Cache\Exception\InvalidArgumentException; use Cake\TestSuite\TestCase; use DateInterval; +use Exception; use Memcached; use function Cake\Core\env; @@ -512,6 +513,36 @@ public function testReadMany(): void $this->assertNull($read['App.doesNotExist']); } + /** + * Test readMany where null is a valid cache value + * + * @throws \Psr\SimpleCache\InvalidArgumentException + */ + public function testReadManyTreatNullAsValidCacheValue(): void + { + $this->_configCache(['duration' => 2]); + $data = [ + 'App.falseTest' => false, + 'App.trueTest' => true, + 'App.nullTest' => null, + 'App.zeroTest' => 0, + 'App.zeroTest2' => '0', + ]; + foreach ($data as $key => $value) { + Cache::write($key, $value, 'memcached'); + } + + $default = new Exception('Cache key not found'); + $read = Cache::pool('memcached')->getMultiple(array_merge(array_keys($data), ['App.doesNotExist']), $default); + + $this->assertFalse($read['App.falseTest']); + $this->assertTrue($read['App.trueTest']); + $this->assertNull($read['App.nullTest']); + $this->assertSame($read['App.zeroTest'], 0); + $this->assertSame($read['App.zeroTest2'], '0'); + $this->assertSame($default, $read['App.doesNotExist']); + } + /** * testWriteMany method */ From ceb10b915f056786b72f43bf005c8152cbe418a5 Mon Sep 17 00:00:00 2001 From: Val Bancer Date: Tue, 1 Apr 2025 13:56:48 +0200 Subject: [PATCH 4/6] Fix usage of deprecated method in ReconnectStrategy.php --- src/Database/Retry/ReconnectStrategy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Database/Retry/ReconnectStrategy.php b/src/Database/Retry/ReconnectStrategy.php index ac847810fe6..25fb69f8065 100644 --- a/src/Database/Retry/ReconnectStrategy.php +++ b/src/Database/Retry/ReconnectStrategy.php @@ -109,7 +109,7 @@ protected function reconnect(): bool } try { - $this->connection->connect(); + $this->connection->getDriver()->connect(); if ($this->connection->isQueryLoggingEnabled()) { $this->connection->log('[RECONNECT]'); } From 4ebf5dccd114a6292e541f511b091a121549000f Mon Sep 17 00:00:00 2001 From: Alejandro Ibarra Date: Wed, 2 Apr 2025 23:51:48 +0200 Subject: [PATCH 5/6] 18263 - Fix method and finder map population when using BehaviorRegistry::set() (#18267) --- src/ORM/BehaviorRegistry.php | 18 ++++++++++++++++++ tests/TestCase/ORM/BehaviorRegistryTest.php | 12 ++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/ORM/BehaviorRegistry.php b/src/ORM/BehaviorRegistry.php index 9f006a1bdfd..fc06b311882 100644 --- a/src/ORM/BehaviorRegistry.php +++ b/src/ORM/BehaviorRegistry.php @@ -203,6 +203,24 @@ protected function _getMethods(Behavior $instance, string $class, string $alias) return compact('methods', 'finders'); } + /** + * Set an object directly into the registry by name. + * + * @param string $name The name of the object to set in the registry. + * @param \Cake\ORM\Behavior $object instance to store in the registry + * @return $this + */ + public function set(string $name, object $object) + { + parent::set($name, $object); + + $methods = $this->_getMethods($object, get_class($object), $name); + $this->_methodMap += $methods['methods']; + $this->_finderMap += $methods['finders']; + + return $this; + } + /** * Remove an object from the registry. * diff --git a/tests/TestCase/ORM/BehaviorRegistryTest.php b/tests/TestCase/ORM/BehaviorRegistryTest.php index 7062a3eb660..c09bf5be1d0 100644 --- a/tests/TestCase/ORM/BehaviorRegistryTest.php +++ b/tests/TestCase/ORM/BehaviorRegistryTest.php @@ -24,6 +24,7 @@ use Cake\TestSuite\TestCase; use LogicException; use RuntimeException; +use TestApp\Model\Behavior\SluggableBehavior; /** * Test case for BehaviorRegistry. @@ -209,6 +210,17 @@ public function testLoadDuplicateFinderAliasing(): void $this->assertTrue($this->Behaviors->hasFinder('renamed')); } + /** + * Test set() + */ + public function testSet(): void + { + $this->Behaviors->set('Sluggable', new SluggableBehavior($this->Table, ['replacement' => '_'])); + + $this->assertEquals(['replacement' => '_'], $this->Behaviors->get('Sluggable')->getConfig()); + $this->assertTrue($this->Behaviors->hasMethod('slugify')); + } + /** * test hasMethod() */ From d3c196c92fde430dc395b14b058dd240c3de42be Mon Sep 17 00:00:00 2001 From: Mark Story Date: Sat, 26 Apr 2025 18:40:45 -0400 Subject: [PATCH 6/6] Update version number to 4.6.1 --- VERSION.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.txt b/VERSION.txt index 4ee60801c57..7bfb2d6297b 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -16,4 +16,4 @@ // @license https://opensource.org/licenses/mit-license.php MIT License // +--------------------------------------------------------------------------------------------+ // //////////////////////////////////////////////////////////////////////////////////////////////////// -4.6.0 +4.6.1