From 3014fa22e55dee30099475506370f87cec404eb2 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Sat, 14 Oct 2023 12:28:22 +0800 Subject: [PATCH 1/9] fix: #20002 optimize head request on serializeDataProvider --- framework/rest/Serializer.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/rest/Serializer.php b/framework/rest/Serializer.php index edc689e94e8..eedd96c2cc6 100644 --- a/framework/rest/Serializer.php +++ b/framework/rest/Serializer.php @@ -188,6 +188,12 @@ protected function getRequestedFields() */ protected function serializeDataProvider($dataProvider) { + if (($pagination = $dataProvider->getPagination()) !== false) { + $this->addPaginationHeaders($pagination); + } + if ($this->request->getIsHead()) { + return null; + } if ($this->preserveKeys) { $models = $dataProvider->getModels(); } else { @@ -195,13 +201,7 @@ protected function serializeDataProvider($dataProvider) } $models = $this->serializeModels($models); - if (($pagination = $dataProvider->getPagination()) !== false) { - $this->addPaginationHeaders($pagination); - } - - if ($this->request->getIsHead()) { - return null; - } elseif ($this->collectionEnvelope === null) { + if ($this->collectionEnvelope === null) { return $models; } From b9a30a8df2cb2ca1ebfba959af1fb109973d4e12 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 15:56:32 +0800 Subject: [PATCH 2/9] feat: add HEAD unit test serializer --- tests/framework/rest/SerializerTest.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 361aba38a91..48627eeeca8 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -9,7 +9,9 @@ use yii\base\Model; use yii\data\ArrayDataProvider; +use yii\data\DataProviderInterface; use yii\rest\Serializer; +use yii\web\Request; use yiiunit\TestCase; /** @@ -413,6 +415,16 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $serializer->preserveKeys = $saveKeys; $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + + $_SERVER['REQUEST_METHOD'] = 'HEAD'; + $request = new Request(); + $_POST[$request->methodParam] = 'HEAD'; + $serializer = new Serializer([ + 'request' => $request + ]); + $serializer->preserveKeys = $saveKeys; + $this->assertEmpty($serializer->serialize($dataProvider)); + unset($_POST[$request->methodParam], $_SERVER['REQUEST_METHOD']); } /** From c314febd95ee5f114075549e64089075ef48d677 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:02:48 +0800 Subject: [PATCH 3/9] core: add changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 64e997ee82e..ee2a23a65d8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,7 +7,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - +- Bug #20002: fixed superfluous query on HEAD request in serializer 2.0.49.2 October 12, 2023 ------------------------- From e11819ddbe741bfc6b9d808cdc14aea32ceb2380 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:16:42 +0800 Subject: [PATCH 4/9] fix: changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ee2a23a65d8..e08d38fe4e5 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,8 +6,8 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) - Bug #20002: fixed superfluous query on HEAD request in serializer +- Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 ------------------------- From b4697641d398a5ccf5f2691dd5be43949ad93c3c Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:18:29 +0800 Subject: [PATCH 5/9] fix: changelog --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e08d38fe4e5..22503c8dde8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Bug #20002: fixed superfluous query on HEAD request in serializer +- Bug #20002: fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 From 344b0aecf35acb79417de3b812de00a01941222c Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Wed, 18 Oct 2023 16:36:43 +0800 Subject: [PATCH 6/9] core: add collectionEnvelope unit test --- tests/framework/rest/SerializerTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 48627eeeca8..e057a1446b4 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -416,6 +416,12 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + $serializer = new Serializer(); + $serializer->preserveKeys = $saveKeys; + $serializer->collectionEnvelope = 'data'; + + $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)['data']); + $_SERVER['REQUEST_METHOD'] = 'HEAD'; $request = new Request(); $_POST[$request->methodParam] = 'HEAD'; From f28386835d21616e323bd88ee2fdc75abf77215f Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 19 Oct 2023 20:35:59 +0300 Subject: [PATCH 7/9] Update framework/CHANGELOG.md --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 22503c8dde8..f039bec955b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -6,7 +6,7 @@ Yii Framework 2 Change Log - Bug #13920: Fixed erroneous validation for specific cases (tim-fischer-maschinensucher) - Bug #19927: Fixed `console\controllers\MessageController` when saving translations to database: fixed FK error when adding new string and language at the same time, checking/regenerating all missing messages and dropping messages for unused languages (atrandafir) -- Bug #20002: fixed superfluous query on HEAD request in serializer (xicond) +- Bug #20002: Fixed superfluous query on HEAD request in serializer (xicond) - Enh #12743: Added new methods `BaseActiveRecord::loadRelations()` and `BaseActiveRecord::loadRelationsFor()` to eager load related models for existing primary model instances (PowerGamer1) 2.0.49.2 October 12, 2023 From ace4a5b888c4594e11fe6e65705730b6bddb9031 Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Fri, 20 Oct 2023 10:47:17 +0800 Subject: [PATCH 8/9] fix: separate test Head Serialize DataProvider --- tests/framework/rest/SerializerTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index e057a1446b4..07ca6c4f7f0 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -402,6 +402,11 @@ public function dataProviderSerializeDataProvider() ]; } + public function dataProviderHeadSerializeDataProvider() + { + return $this->dataProviderSerializeDataProvider(); + } + /** * @dataProvider dataProviderSerializeDataProvider * @@ -415,7 +420,17 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK $serializer->preserveKeys = $saveKeys; $this->assertEquals($expectedResult, $serializer->serialize($dataProvider)); + } + /** + * @dataProvider dataProviderHeadSerializeDataProvider + * + * @param \yii\data\DataProviderInterface $dataProvider + * @param array $expectedResult + * @param bool $saveKeys + */ + public function testHeadSerializeDataProvider($dataProvider, $expectedResult, $saveKeys = false) + { $serializer = new Serializer(); $serializer->preserveKeys = $saveKeys; $serializer->collectionEnvelope = 'data'; From ce13f0f35ab648fd39880b4a6e5cd8b5395d793a Mon Sep 17 00:00:00 2001 From: Akbar Herlambang Date: Fri, 20 Oct 2023 16:22:19 +0800 Subject: [PATCH 9/9] refactor: cleanup SerializerTest --- tests/framework/rest/SerializerTest.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/framework/rest/SerializerTest.php b/tests/framework/rest/SerializerTest.php index 07ca6c4f7f0..217d7fbf7a9 100644 --- a/tests/framework/rest/SerializerTest.php +++ b/tests/framework/rest/SerializerTest.php @@ -9,7 +9,6 @@ use yii\base\Model; use yii\data\ArrayDataProvider; -use yii\data\DataProviderInterface; use yii\rest\Serializer; use yii\web\Request; use yiiunit\TestCase; @@ -402,11 +401,6 @@ public function dataProviderSerializeDataProvider() ]; } - public function dataProviderHeadSerializeDataProvider() - { - return $this->dataProviderSerializeDataProvider(); - } - /** * @dataProvider dataProviderSerializeDataProvider * @@ -423,7 +417,7 @@ public function testSerializeDataProvider($dataProvider, $expectedResult, $saveK } /** - * @dataProvider dataProviderHeadSerializeDataProvider + * @dataProvider dataProviderSerializeDataProvider * * @param \yii\data\DataProviderInterface $dataProvider * @param array $expectedResult