From 42a3d84d8acbb820443fea4a971f79c93ebba84e Mon Sep 17 00:00:00 2001 From: Austin Collier Date: Sun, 17 Mar 2024 08:22:06 -0600 Subject: [PATCH] Changed Collection to allow for reset --- flight/Engine.php | 2 ++ flight/database/PdoWrapper.php | 5 ++--- flight/util/Collection.php | 28 ++++++++++++++++++++++++++++ tests/CollectionTest.php | 23 +++++++++++++++++++++++ 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/flight/Engine.php b/flight/Engine.php index b0ae09da..fdeabb21 100644 --- a/flight/Engine.php +++ b/flight/Engine.php @@ -63,6 +63,8 @@ * # HTTP caching * @method void etag(string $id, ('strong'|'weak') $type = 'strong') Handles ETag HTTP caching. * @method void lastModified(int $time) Handles last modified HTTP caching. + * + * phpcs:disable PSR2.Methods.MethodDeclaration.Underscore */ class Engine { diff --git a/flight/database/PdoWrapper.php b/flight/database/PdoWrapper.php index 4821cb97..bdbabb89 100644 --- a/flight/database/PdoWrapper.php +++ b/flight/database/PdoWrapper.php @@ -48,9 +48,8 @@ public function runQuery(string $sql, array $params = []): PDOStatement */ public function fetchField(string $sql, array $params = []) { - $collection_data = $this->fetchRow($sql, $params); - $array_data = $collection_data->getData(); - return reset($array_data); + $result = $this->fetchRow($sql, $params); + return reset($result); } /** diff --git a/flight/util/Collection.php b/flight/util/Collection.php index 6ffe0b5c..29147d16 100644 --- a/flight/util/Collection.php +++ b/flight/util/Collection.php @@ -20,6 +20,18 @@ */ class Collection implements ArrayAccess, Iterator, Countable, JsonSerializable { + /** + * This is to allow for reset() to work properly. + * + * WARNING! This MUST be the first variable in this class!!! + * + * PHPStan is ignoring this because we don't need actually to read the property + * + * @var mixed + * @phpstan-ignore-next-line + */ + private $first_property = null; + /** * Collection data. * @@ -35,6 +47,7 @@ class Collection implements ArrayAccess, Iterator, Countable, JsonSerializable public function __construct(array $data = []) { $this->data = $data; + $this->handleReset(); } /** @@ -55,6 +68,7 @@ public function __get(string $key) public function __set(string $key, $value): void { $this->data[$key] = $value; + $this->handleReset(); } /** @@ -71,6 +85,7 @@ public function __isset(string $key): bool public function __unset(string $key): void { unset($this->data[$key]); + $this->handleReset(); } /** @@ -100,6 +115,7 @@ public function offsetSet($offset, $value): void } else { $this->data[$offset] = $value; } + $this->handleReset(); } /** @@ -120,6 +136,17 @@ public function offsetExists($offset): bool public function offsetUnset($offset): void { unset($this->data[$offset]); + $this->handleReset(); + } + + /** + * This is to allow for reset() of a Collection to work properly. + * + * @return void + */ + public function handleReset() + { + $this->first_property = reset($this->data); } /** @@ -207,6 +234,7 @@ public function getData(): array public function setData(array $data): void { $this->data = $data; + $this->handleReset(); } #[\ReturnTypeWillChange] diff --git a/tests/CollectionTest.php b/tests/CollectionTest.php index b6eac466..4f742feb 100644 --- a/tests/CollectionTest.php +++ b/tests/CollectionTest.php @@ -99,4 +99,27 @@ public function testClear() $this->collection->clear(); $this->assertEquals(0, $this->collection->count()); } + + public function testResetByProperty() + { + $this->collection->a = 11; + $this->collection->b = 22; + $result = reset($this->collection); + $this->assertEquals(11, $result); + } + + public function testResetBySetData() + { + $this->collection->setData(['a' => 11, 'b' => 22]); + $result = reset($this->collection); + $this->assertEquals(11, $result); + } + + public function testResetByArraySet() + { + $this->collection['a'] = 11; + $this->collection['b'] = 22; + $result = reset($this->collection); + $this->assertEquals(11, $result); + } }