【问题标题】:Laravel Api only returns empty objectsLaravel Api 只返回空对象
【发布时间】:2017-07-29 03:07:31
【问题描述】:

我试图从我的 Laravel api 路由返回一个对象,但返回的只是一个空数组。

我的模型如下所示:

    class MobilePageStats extends Model
    {
        //
        private $score;
        private $mobileFriendly;
        private $numberRobotedResources;
        private $numberTransientFetchFailureResources;
        private $transientFetchFailureUrls;
        private $cms;
        private $ruleResults;

        /**
         * MobilePageStats constructor.
         * @param int $score
         * @param bool $mobileFriendly
         * @param int $numberRobotedResources
         * @param int $numberTransientFetchFailureResources
         * @param array $transientFetchFailureUrls
         * @param string $cms
         * @param array $ruleResults
         */
        public function __construct(
            $score,
            $mobileFriendly,
            $numberRobotedResources,
            $numberTransientFetchFailureResources,
            $transientFetchFailureUrls,
            $cms,
            $ruleResults
        ) {
            $this->score = $score;
            $this->mobileFriendly = $mobileFriendly;
            $this->numberRobotedResources = $numberRobotedResources;
            $this->numberTransientFetchFailureResources = $numberTransientFetchFailureResources;
            $this->transientFetchFailureUrls = $transientFetchFailureUrls;
            $this->cms = $cms;
            $this->ruleResults = $ruleResults;
        }

而且我也得到了所有东西的吸气剂。

我用构造函数在我的控制器中设置了所有数据,在这个函数中:

public function getData() {
            $cms = "";
            $score = $this->data->ruleGroups->USABILITY->score;
            $mobileFriendly = $this->data->ruleGroups->USABILITY->pass;
            if(isset($this->data->pageStats->numberRobotedResources)){
                $numberRobotedResources = $this->data->pageStats->numberRobotedResources;
            }else{
                $numberRobotedResources = '';
            }
            if(isset($this->data->pageStats->numberTransientFetchFailureResources)){
                $numberTransientFetchFailureResources = $this->data->pageStats->numberTransientFetchFailureResources;
            }else{
                $numberTransientFetchFailureResources = '';
            }
            if(isset($this->data->pageStats->transientFetchFailureUrls)){
                $transientFetchFailureUrls =  $this->data->pageStats->transientFetchFailureUrls;
            }else{
                $transientFetchFailureUrls = '';
            }
            if(isset($this->data->pageStats->cms)){
                $cms = $this->data->pageStats->cms;
                if($cms != 'WORDPRESS' && $cms != 'JOOMLA'){
                    $cms = $this->checkCMS();
                }
            }
            $cvp = $this->getConfigureViewport();
            $fontSizes = $this->getUseLegibleFontSizes();
            $avoidPlugins = $this->getAvoidPlugins();
            $sizeToViewport = $this->getSizeContentToViewport();
            $tapTargets = $this->getSizeTapTargetsAppropriately();
            $ruleResults = [$cvp, $fontSizes, $avoidPlugins, $sizeToViewport, $tapTargets];


            $mobilePageStats = new MobilePageStats($score, $mobileFriendly, $numberRobotedResources,
                $numberTransientFetchFailureResources, $transientFetchFailureUrls, $cms, $ruleResults);

            return $mobilePageStats;

        }

然后,在我的 API 路由中,我尝试像这样返回模型:

Route::get('/mobilePageSpeed', function(Request $request){
    $data = new PageSpeedMobileController($request->url);
    return response($data->getData());
});

但是当我提出请求时,我得到的只是:

<body>
<pre style="word-wrap: break-word; white-space: pre-wrap;">[]</pre>
</body>

为什么没有返回对象?我知道它包含数据,因为我可以打印它。但是发不出去?

repsonse()->json($data->getData()); 我都试过了还有 json_encode($data->getData()),但它们给我的结果是一样的吗?我似乎无法找到有效的解决方案。

那么如何从 Laravel Api 返回对象?

【问题讨论】:

    标签: php json laravel


    【解决方案1】:

    你用你的版本覆盖了原来的模型构造函数,模型没有填充属性也没有启动。

    我不知道你想要实现什么,但是如果你从 Eloquent\Model 扩展一个类,你不能覆盖自己的构造函数而不调用原始构造函数,即:

     public function __construct(array $attributes = [])
     {
        parent::__construct($attributes);
    

    【讨论】:

    • 我试图删除扩展模型,因为据我所知,我真的不需要模型的扩展。但这给出了相同的结果。所以我认为这不会解决我的问题。
    • 我不想变得粗鲁,但如果你从 Model 延伸出来也一样,我不能跟着你:我没有时间玩重试游戏。我指出了你的代码的一个重要问题,做你的功课和尝试,如果你仍然有问题,请发布另一个问题。
    • 我明白你的意思,我尝试添加父构造,但这并没有解决我的问题。我认为我不需要扩展模型的原因是因为它只是生成的对象,我不会将它保存在数据库或任何东西中,它的目的只是保存我的数据。我很感谢您抽出宝贵的时间来调查我的问题,但我确实做了功课,尝试了几乎所有我能找到的解决方案,但仍然无法正常工作。
    • 我只能添加一个建议:查看 Eloquent 模型源代码中的 __toString() 和 toJson() 函数。如果你返回一个 response() 你必须给那个函数一个字符串或一个数组。
    【解决方案2】:

    答案是在将每个对象转换为数组后对其进行 json_encode。应该工作:)

    【讨论】:

    • 很好,成功了!但我仍然必须将其作为 json 响应返回
    猜你喜欢
    • 2020-07-04
    • 2014-04-20
    • 2018-11-06
    • 2015-08-27
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    相关资源
    最近更新 更多