php - 使用 Yii 2.0 加密 REST 响应流

标签 php rest yii yii2

我想加密 REST 请求的响应流。我从数据库中获取数据并将其作为 xml (actionAll) 返回。这很好用。然后我添加了一个在响应发送到客户端之前执行的 eventHandler (beforeAction)。这也行。我的问题是,当 eventHandler 调用它时,encryptResponse 方法中的 $response 不包含任何数据。变量内容、数据和流在响应对象中始终为空。

感谢您的帮助!

<?php

namespace app\controllers;

use Yii;
use app\models\Order;
use yii\filters\auth\HttpBasicAuth;
use yii\web\Response;
use app\models\User;

class OrderController extends \yii\rest\Controller{

    /**
    * disable session for REST-Request
    * no loginUrl required  
    */
     public function init(){
        parent::init();
        \Yii::$app->user->enableSession = false;
        \Yii::$app->user->loginUrl = null;
    }

   /**
    * HttpBasicAuth for authentication  
    */
    public function behaviors(){
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
        'auth'  => function ($username, $password) {
            if($username==\Yii::$app->params['HttpBasicAuth']['username'] &&     $password==\Yii::$app->params['HttpBasicAuth']['password']){
                return new User();
            }else{
                return null;
            }
        }];
        return $behaviors;
    }

   /**
    * set response-format to xml
    * fetch data from db
    *   
    */
    public function actionAll(){
        \Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
        $models = Order::find()->all(); 
        return $models;
    }

   /**
    * hook into action and add event handler    
    */
    public function beforeAction($action){      
        $response = Yii::$app->getResponse();
        $response->on(Response::EVENT_BEFORE_SEND, [$this, 'encryptResponse']);
    }

   /**
    * callback for event-handler    
    */
    public function encryptResponse(){
        $response = Yii::$app->getResponse();
        var_dump($response);
    }   
}

最佳答案

您可以在 init 中设置您的响应事件。

或者您只需在 beforeAction 函数中添加 return true ,否则数据将为 null 因为未调用该操作, Yii2 文档中也提到了这一点 here .

use Yii;

...

public function init() 
{
    parent::init();

    Yii::$app->user->enableSession = false;
    Yii::$app->user->loginUrl = null;
    Yii::$app->response->on(Response::EVENT_BEFORE_SEND, [$this, 'encryptResponse']);
}

public function beforeAction($action)
{      
    $response = Yii::$app->getResponse();
    $response->on(Response::EVENT_BEFORE_SEND, [$this, 'encryptResponse']);

    return true; // << required
}

关于php - 使用 Yii 2.0 加密 REST 响应流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29847636/

相关文章:

php - Symfony2 phpunit 测试认证

java - Tomcat 7.0 + Chrome 不显示 JSON

java - 休息客户端 java.net.ConnectException : Connection timed out: connect

php - Yii:奇怪的重定向行为(https -> http)

php - 在 Yii2 中输出关系数据

php - 如何显示mysql中每个唯一项目的信息,合并每个项目的信息

用于停止从浏览器运行脚本的 PHP 代码

java - RESTful Web 服务中的 Autowiring 教程

php - 什么是mysql中的复合外键?

yii - 如何在 yii 的更新 View 中加载多选列表框中的选定列表项?