首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel响应内容必须是实现__toString()的字符串或对象,给定的" object“

Laravel响应内容必须是实现__toString()的字符串或对象,给定的" object“
EN

Stack Overflow用户
提问于 2015-08-02 19:11:14
回答 3查看 30.5K关注 0票数 8

我想运行技能函数,但我做不到。

Route.php

代码语言:javascript
复制
Route::get('setting',function(){
    return \App\User::first()->skills();
});

User.php

代码语言:javascript
复制
protected $casts = [
    'skills' => 'json'
];

public function skills(){
    return new Skills($this , $this->skills);
}

Skills.php

代码语言:javascript
复制
namespace App;
use App\User;
use Mockery\Exception;

class Skills
{
    protected $user;
    protected $skills = [];

    public function __construct(User $user,array $skills){

        $this->user=$user;
        $this->skills=$skills;
    }
}

我想进入/settings页面,我有"The Response content must be a string or object implementing __toString(), "object" given.“错误。

我尝试在路由中添加dd()函数的返回值,我看到了所有的JSON数据,但$skills->get()$skill->set()当时不起作用。

编辑:

Skills.php

代码语言:javascript
复制
<?php
    /**
     * Created by PhpStorm.
     * User: root
     * Date: 01.08.2015
     * Time: 11:45
     */

    namespace App;
    use App\User;
    use Mockery\Exception;

    class Skills
    {
        protected $user;
        protected $skills = [];

        public function __construct(User $user,array $skills){
            $this->user=$user;
            $this->skills=$skills;
        }

        public function get($key){
            return array_get($this->skills,$key);
        }

        public function set($key,$value){
            $this->skills[$key]=$value;
            return $this->duration();
        }

        public function has($key){
            return array_key_exists($key,$this->skills);
        }

        public function all(){
           return $this->skills;
        }

        public function merge(array $attributes){
            $this->skills = array_merge(
                $this->skills,
                array_only(
                    $attributes,
                    array_keys($this->skills)
                )
            );
            return $this->duration();
        }

        public function duration(){
            return $this->user->update(['skills' => $this->skills]);
        }

        public function __get($key){
            if ($this->has($key)) {
                return $this->get($key);
            }
            throw new Exception("{$key} adlı Yetenek bulunamadı");
        }
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-02 19:31:16

当你这样做的时候

代码语言:javascript
复制
return \App\User::first()->skills();

您返回的是关系定义对象,该对象不实现__toString()方法。返回相关对象所需的内容是

代码语言:javascript
复制
return \App\User::first()->skills;

这将返回一个包含相关技能的集合对象-它将被正确序列化。

票数 6
EN

Stack Overflow用户

发布于 2016-10-26 13:59:31

也许你可以通过对象变量使用get_object_vars($skills)和后来的loop。示例:

代码语言:javascript
复制
foreach(get_object_vars($skills) as $prop => $val){
}
票数 1
EN

Stack Overflow用户

发布于 2017-09-19 00:23:09

Route.php中,返回如下所示的集合

代码语言:javascript
复制
Route::get('setting',function(){
     return \App\User::first()->skills;
});

代码语言:javascript
复制
Route::get('setting',function(){
    $skills = \App\User::first(['id','skills']);
    return $skills->skills;
});

在你的User.php模型上,你可以这样分解你的代码

代码语言:javascript
复制
protected $casts = [
    'skills' => 'json'
];

public function skills()
{
    return $this->skills;
}

我希望这对某些人有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31771276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档