文档章节

【Yii2-CookBook】JSON 和 XML 输出

 小田天
发布于 2016/11/19 13:23
字数 805
阅读 17
收藏 0

使用不同的响应类型

Web 和移动应用程序现在不仅仅只是用来呈现 HTML。 现在开发一个移动客户端,利用服务器 api 驱动前端,所有的用户交互都在客户端哪里。JSON 和 XML 格式通常用于序列化和传输结构化数据通过网络,所以能够创建这样的响应是任何一个现代服务器框架的必备。

响应格式

正如你可能知道的,在 Yii2 中需要从你的 action return 结果,而不是直接回应:

// returning HTML result
return $this->render('index', [
    'items' => $items,
]);

好事是现在你可以从你的 action 直接返回不同类型的数据,即:

  • 数组
  • 一个实现 Arrayable 接口的对象
  • 一个字符串
  • 一个实现 __toString() 方法的对象。

只是别忘了告诉 Yii 做什么你想要的结果的格式,在 return 之前设置 \Yii::$app->response->format。例如:

\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

有效的格式:

  • FORMAT_RAW
  • FORMAT_HTML
  • FORMAT_JSON
  • FORMAT_JSONP
  • FORMAT_XML

默认是 FORMAT_HTML.

JSON 响应

让我们返回一个数组:

public function actionIndex()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $items = ['some', 'array', 'of', 'data' => ['associative', 'array']];
    return $items;
}

瞧!——我们的 JSON 响应框:

结果

{
    "0": "some",
    "1": "array",
    "2": "of",
    "data": ["associative", "array"]
}

Note: 你会得到一个异常,如果没有设置响应格式。

我们已经知道,我们也可以返回对象。

public function actionView($id)
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $user = \app\models\User::find($id);
    return $user;
}

现在 $user 是 实现 Arrayable 接口的类 ActiveRecord 的实例,所以它可以很容易地转换为 JSON:

结果

{
    "id": 1,
    "name": "John Doe",
    "email": "john@example.com"
}

我们甚至可以返回一个对象数组:

public function actionIndex()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $users = \app\models\User::find()->all();
    return $users;
}

现在 $users 是 ActiveRecord 对象数组,但是在下面 Yii 使用 \yii\helpers\Json::encode() 遍历数据传递和转换,照顾类型本身:

结果

[
    {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com"
    },
    {
        "id": 2,
        "name": "Jane Foo",
        "email": "jane@example.com"
    },
    ...
]

XML 响应

响应格式改为 FORMAT_XML 这样。现在你有了 XML:

public function actionIndex()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
    $items = ['some', 'array', 'of', 'data' => ['associative', 'array']];
    return $items;
}

结果

<response>
    <item>some</item>
    <item>array</item>
    <item>of</item>
    <data>
        <item>associative</item>
        <item>array</item>
    </data>
</response>

是的,我们可以跟我们之前做的一样转换对象和数组的对象。

public function actionIndex()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
    $users = \app\models\User::find()->all();
    return $users;
}

结果

<response>
    <User>
        <id>1</id>
        <name>John Doe</name>
        <email>john@example.com</email>
    </User>
    <User>
        <id>2</id>
        <name>Jane Foo</name>
        <email>jane@example.com</email>
    </User>
</response>

自定义响应格式

让我们创建一个定制的响应格式。例子做点有趣和疯狂的事我回应 PHP 数组。 首先,我们需要格式化程序本身。创建components/PhpArrayFormatter.php

<?php
namespace app\components;

use yii\helpers\VarDumper;
use yii\web\ResponseFormatterInterface;

class PhpArrayFormatter implements ResponseFormatterInterface
{
    public function format($response)
    {
        $response->getHeaders()->set('Content-Type', 'text/php; charset=UTF-8');
        if ($response->data !== null) {
            $response->content = "<?php\nreturn " . VarDumper::export($response->data) . ";\n";
        }
    }
}

现在我们需要在注册应用程序配置 (通常是 config/web.php):

return [
    // ...
    'components' => [
        // ...
        'response' => [
            'formatters' => [
                'php' => 'app\components\PhpArrayFormatter',
            ],
        ],
    ],
];

现在是准备使用。在 controllers/SiteController 创建一个新的方法 actionTest:

public function actionTest()
{
    Yii::$app->response->format = 'php';
    return [
        'hello' => 'world!',
    ];
}

就是这样。执行后,Yii 将回应以下:

<?php
return [
    'hello' => 'world!',
];

打赏作者

 

本文转载自:https://getyii.com/topic/182

共有 人打赏支持
粉丝 0
博文 79
码字总数 49841
作品 0
怀化
私信 提问
yii2 输出xml格式数据

作者:白狼 出处:http://www.manks.top/yii2xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的...

白狼栈
2016/05/03
76
0
Yii2 Day 3: 让PHPStorm支持自定义Component依赖注入代码提示

场景是这样的: 定义了一个 MyComponent,在配置文件中加上这个组件的定义,比如: 'myComponent'=>['class'=>'app/components/MyComponent'], 就可以用Yii::$app->myComponent调用啦,但是,...

_Elvis
2014/12/02
0
3
使用Yii2时遇到的实际问题

最近一直在学习Yii2框架,可能是一直以来对它的青睐,让我难以对其它框架再产生兴趣,学习中遇到了许多问题,于是把问题和解决办法也记录下来,这样方便以后复习和交流。 ## 目录 扩展XmlRe...

小田天
2016/12/09
28
0
yii2开发总结(一)

使用yii2的基础版本进行开发。 1. 部署 runtimePath 如果有修改 需要 在config/web.php 中置顶新路径 并且确保此路径具有读写权限 应用的静态文件 AppAsset 会在模板布局中使用 也需要保证 ...

龍sky腾
2016/08/16
26
0
Yii 2 —— 导入Excel文件

导入Excel文件需要两个扩展:PHPOffice/PHPExcel和moonlandsoft/yii2-phpexcel,这两个扩展中,PHPOffice/PHPExcel是基础的Excel文件接口,moonlandsoft/yii2-phpexcel提供了导入和导出的功能...

tywali
2017/06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

git reset放弃修改&放弃增加文件

1. 本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改。 单个文件/文件夹: $ git checkout -- filename 所有文件/文件夹: $ git checkout . 2. 本地新增了一堆文件(并没有git a...

JamesView
7分钟前
0
0
UnaryOperator函数式接口

这是一个函数式接口,因此可以用作lambda表达式或方法引用的赋值目标。 可以看到UnaryOperator<T>继承了Function<T,T>接口,这里可是两个T,T,还增加了static修饰的identity()方法。 然后我们...

woshixin
7分钟前
0
0
关于java包装类型的缓存

除了Float 和 Double 外,其他包装数据类型都会缓存 -128 ~127 的值,对于 Integer var = ? 在 -127~128 之间的赋值,Integer 对像由IntegerCache.cache 产生,会复用已有对像,这个区间内的...

Canaan_
10分钟前
1
0
mysql复合主键

表: CREATE TABLE `w_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`,`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 实践: 1、添加i......

shikamaru
10分钟前
0
0
记一下自己理解的SSL

步骤 操作 客户端钥匙(随机数)数量 服务端钥匙(随机数)数量 1 客户端生成一把钥匙, 发给服务器 1 0 2 服务器确认支持 1 1 3 服务器 生成一把钥匙 发给客户端,并且把公钥(证书)给他 ...

Gavin-King
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部