From a0ca37ed6a00132965ee54b34811e80973630ba1 Mon Sep 17 00:00:00 2001 From: Andrew Nester Date: Fri, 15 Jan 2016 17:44:17 +0300 Subject: [PATCH] 10545 - Fix for XMLResponseFormatter to format models in a proper way --- framework/CHANGELOG.md | 1 + framework/web/XmlResponseFormatter.php | 4 +++- tests/framework/web/FormatterTest.php | 14 +++++++++++++- .../framework/web/JsonResponseFormatterTest.php | 8 ++++++++ .../framework/web/XmlResponseFormatterTest.php | 11 +++++++++++ tests/framework/web/stubs/ModelStub.php | 17 +++++++++++++++++ 6 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 tests/framework/web/stubs/ModelStub.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index aa53bc4e65..5300a86a15 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -106,6 +106,7 @@ Yii Framework 2 Change Log - Enh #10359: Support wildcard category name in `yii/console/controllers/MessageController` (rmrevin) - Enh #10390: Added ability to disable outer tag for `\yii\helpers\BaseHtml::radiolist()`, `::checkboxList()` (TianJinRong, githubjeka, silverfire) - Enh #10535: Allow passing a `yii\db\Expression` to `Query::orderBy()` and `Query::groupBy()` (andrewnester, cebe) +- Enh #10545: `yii\web\XMLResponseFormatter` changed to format models in a proper way (andrewnester) - Enh: Added last resort measure for `FileHelper::removeDirectory()` fail to unlink symlinks under Windows (samdark) - Chg #9369: `Yii::$app->user->can()` now returns `false` instead of erroring in case `authManager` component is not configured (creocoder) - Chg #9411: `DetailView` now automatically sets container tag ID in case it's not specified (samdark) diff --git a/framework/web/XmlResponseFormatter.php b/framework/web/XmlResponseFormatter.php index 6c0b43fc64..458ffd5d2f 100644 --- a/framework/web/XmlResponseFormatter.php +++ b/framework/web/XmlResponseFormatter.php @@ -77,7 +77,9 @@ class XmlResponseFormatter extends Component implements ResponseFormatterInterfa */ protected function buildXml($element, $data) { - if (is_array($data) || $data instanceof \Traversable && $this->useTraversableAsArray) { + if (is_array($data) || + ($data instanceof \Traversable && $this->useTraversableAsArray && !$data instanceof Arrayable) + ) { foreach ($data as $name => $value) { if (is_int($name) && is_object($value)) { $this->buildXml($element, $value); diff --git a/tests/framework/web/FormatterTest.php b/tests/framework/web/FormatterTest.php index d956ec3ce3..b67052b596 100644 --- a/tests/framework/web/FormatterTest.php +++ b/tests/framework/web/FormatterTest.php @@ -86,4 +86,16 @@ abstract class FormatterTest extends \yiiunit\TestCase $this->formatter->format($this->response); $this->assertEquals($json, $this->response->content); } -} \ No newline at end of file + + /** + * @param mixed $data the data to be formatted + * @param string $expectedResult the expected body + * @dataProvider formatModelDataProvider + */ + public function testFormatModels($data, $expectedResult) + { + $this->response->data = $data; + $this->formatter->format($this->response); + $this->assertEquals($expectedResult, $this->response->content); + } +} diff --git a/tests/framework/web/JsonResponseFormatterTest.php b/tests/framework/web/JsonResponseFormatterTest.php index 33fad39336..89f75f90eb 100644 --- a/tests/framework/web/JsonResponseFormatterTest.php +++ b/tests/framework/web/JsonResponseFormatterTest.php @@ -8,6 +8,7 @@ namespace yiiunit\framework\web; use yii\web\JsonResponseFormatter; +use yiiunit\framework\web\stubs\ModelStub; /** * @author Alexander Makarov @@ -87,6 +88,13 @@ class JsonResponseFormatterTest extends FormatterTest ]; } + public function formatModelDataProvider() + { + return [ + [new ModelStub(['id' => 123, 'title' => 'abc', 'hidden' => 'hidden']), '{"id":123,"title":"abc"}'] + ]; + } + /** * @param mixed $data the data to be formatted * @param string $json the expected JSON body diff --git a/tests/framework/web/XmlResponseFormatterTest.php b/tests/framework/web/XmlResponseFormatterTest.php index dd00c203e1..359d1ef67d 100644 --- a/tests/framework/web/XmlResponseFormatterTest.php +++ b/tests/framework/web/XmlResponseFormatterTest.php @@ -8,6 +8,7 @@ namespace yiiunit\framework\web; use yii\web\XmlResponseFormatter; +use yiiunit\framework\web\stubs\ModelStub; /** * @author Qiang Xue @@ -104,4 +105,14 @@ class XmlResponseFormatterTest extends FormatterTest ], "123<>456def\n"], ]); } + + public function formatModelDataProvider() + { + return $this->addXmlHead([ + [ + new ModelStub(['id' => 123, 'title' => 'abc', 'hidden' => 'hidden']), + "123abc\n" + ] + ]); + } } diff --git a/tests/framework/web/stubs/ModelStub.php b/tests/framework/web/stubs/ModelStub.php new file mode 100644 index 0000000000..aa3f38883e --- /dev/null +++ b/tests/framework/web/stubs/ModelStub.php @@ -0,0 +1,17 @@ + $this->id, 'title' => $this->title]; + } +}