Browse Source

Use "toArray()" when available.

Type casting object implementing ArrayAccess does not yield the expected array.
ADmad 10 years ago
parent
commit
b6eb79e51f
2 changed files with 5 additions and 1 deletions
  1. 3 0
      src/Utility/Hash.php
  2. 2 1
      tests/TestCase/Utility/HashTest.php

+ 3 - 0
src/Utility/Hash.php

@@ -156,6 +156,9 @@ class Hash
             list($token, $conditions) = self::_splitConditions($token);
 
             foreach ($context[$_key] as $item) {
+                if (is_object($item) && method_exists($item, 'toArray')) {
+                    $item = $item->toArray();
+                }
                 foreach ((array)$item as $k => $v) {
                     if (static::_matchToken($k, $token)) {
                         $next[] = $v;

+ 2 - 1
tests/TestCase/Utility/HashTest.php

@@ -15,6 +15,7 @@
 namespace Cake\Test\TestCase\Utility;
 
 use ArrayObject;
+use Cake\ORM\Entity;
 use Cake\TestSuite\TestCase;
 use Cake\Utility\Hash;
 
@@ -152,7 +153,7 @@ class HashTest extends TestCase
     public static function articleDataObject()
     {
         return new ArrayObject([
-            new ArrayObject([
+            new Entity([
                 'Article' => new ArrayObject([
                     'id' => '1',
                     'user_id' => '1',