消费队列的时候,控制器返回的数据对象如何取值?

Doogeli

问题描述

我的逻辑是:python采集数据,扔进redis队列,然后消费者扔给控制器,返回数据库数据,再扔给其它队列去消费,现在是返回的数据一直错误,json_decode 出来的是空的,打印出来的是对象,但是不是一般的对象。["_body":protected] ,这里我看 Response 里面有这个方法,但好像不是针对这个对象的?我尝试了,没效果。但我在控制器,同样的model返回的,都直接可以用数组返问到?这又是为何?

     * Get http raw body.
     * 
     * @return string
     */
    public function rawBody() {
        return $this->_body;
    }
<?php

namespace app\queue\redis;
use support\Requests;
use support\Response;
use Webman\RedisQueue\Redis;
use Webman\RedisQueue\Consumer;
use Webman\RedisQueue\Client;
use app\api\controller\GameController;

class LotterySend implements Consumer
{

    // 要消费的队列
    public $queue = 'lottery_queue_1010'; // 一千零一夜

    public $connection = 'default';

    // 消费者进程数

    public function consume($data)
    {

        $gameController = new GameController();
        $lottery_Data = $gameController->lotteryInsert($data);
        var_dump($lottery_Data); //这里打印出来的数据如下
        $result = json_decode($lottery_Data);
        var_dump($result); //这里打印出来的是空的
    //    if($result['code'] == 200)
    //    {
    //         $sendData = ['data' => $result['data']];
    //        // 同步投递消息
    //        // Redis::send($sub_queue, $sendData);

    //        // 异步投递消息 // 将结果发送到其他消费者
    //        Client::send('push-to-app', $sendData); // 推送给前端APP消费者
    //        Client::send('push-to-settlement', $sendData); // 推送给后端结算消费者

    //    }else{

    //         return json(['code'=>400,'data'=>'', 'msg' => '入库返回数据有误']);
    //    }
    }

}
var_dump($lottery_Data); //这里打印出来的数据如下

#12 {main}object(support\Response)#103 (7) {
  ["exception":protected]=>
  NULL
  ["_header":protected]=>
  array(1) {
    ["Content-Type"]=>
    string(16) "application/json"
  }
  ["_status":protected]=>
  int(200)
  ["_reason":protected]=>
  NULL
  ["_version":protected]=>
  string(3) "1.1"
  ["_body":protected]=>
  string(310) "{"code":200,"data":{"id":224,"created_at":"2023-08-21 03:13:50","updated_at":"2023-08-21 03:13:50","typeid":1,"typename":"星座","game_itemid":7,"game_itemname":"狮子","issue":"1223","dimension":"1692558780","num":7,"xmm":"10","colorcode":"#FFDAB9"},"msg":"入库成功"}"
  ["file"]=>
  NULL
}
NULL

$lottery_Data = $gameController->lotteryInsert($data); 这里是控制器

控制器最后的代码就是查询最后的插入ID,返回一些数据:

// 通过事务确保数据一致性

        $last_id = Game::GetId($insertData);
        if ($last_id) {
            $res_data = Game::getGameById($last_id);
            return json(['code' => 200, 'data' => $res_data, 'msg' => '入库成功']);
        }

下面是GAME model,用的是TPROM,

     /**
     *  获取指定ID的游戏记录
     */
    public static function getGameById($id){

        $query = self::where(['id'=>$id])->find();

        return $query;
    }

为此你搜索到了哪些方案及不适用的原因

318 1 0
1个回答

nitron

在消费端new 一个controller是什么操作?直接队列处理逻辑即可?为何还要走一到控制器?

你把GameController里的lotteryInsert的处理逻辑放倒LotterySend里不行吗?

return json返回的是一个Response, 你要获得这个response需要用curl之类http client去获取

  • Doogeli 2023-08-21

    原来这样,谢谢大佬~也是可以的,只不过,那个GameController对外开放的api接口而己~

🔝