【问题标题】:Laravel The Response content must be a string or object implementing __toString(), "object" givenLaravel 的响应内容必须是字符串或对象,实现 __toString(),“object”给定
【发布时间】:2015-10-24 14:45:15
【问题描述】:

我想运行技能功能,但我不能。

Route.php

Route::get('setting',function(){
    return \App\User::first()->skills();
});

用户.php

protected $casts = [
    'skills' => 'json'
];

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

技能.php

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() 当时没有工作。

编辑:

技能.php

<?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ı");
        }
    }

【问题讨论】:

    标签: php json laravel laravel-4 laravel-5


    【解决方案1】:

    Route.php中,像这样返回一个集合

    Route::get('setting',function(){
         return \App\User::first()->skills;
    });
    

    Route::get('setting',function(){
        $skills = \App\User::first(['id','skills']);
        return $skills->skills;
    });
    

    在你的 User.php 模型上,你可以考虑你的代码

    protected $casts = [
        'skills' => 'json'
    ];
    
    public function skills()
    {
        return $this->skills;
    }
    

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

    【讨论】:

      【解决方案2】:

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

      foreach(get_object_vars($skills) as $prop => $val){
      }
      

      【讨论】:

        【解决方案3】:

        当你这样做时

        return \App\User::first()->skills();
        

        您正在返回未实现 __toString() 方法的关系定义对象。为了返回相关对象,您需要的是

        return \App\User::first()->skills;
        

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

        【讨论】:

        • 感谢回答我正在尝试,但我想运行 \App\User::first()->skills()->set("HTML","100");返回\App\User::first()->技能;未设置 :)
        • 那个 set() 函数应该做什么?你使用的是什么版本的 Laravel?我在 Laravel 的代码中看不到类似的东西
        • 哦,我认为 Skills() 是 User 和 Skills 之间的一对多关系,而不是一些自定义函数
        • 好的,两件事。如果你想从控制器返回 Skills 对象,它需要实现 __toString() 方法 - 它没有,这就是你收到错误的原因。你在代码中所做的事情对于 Laravel 来说是非常不寻常的——你似乎实现了某种关系,但你自己做,而不是使用 Eloquent 的功能。查看文档以了解如何定义模型之间的关系:laravel.com/docs/5.1/eloquent-relationships
        猜你喜欢
        • 1970-01-01
        • 2016-05-11
        • 2012-08-20
        • 2017-08-17
        • 2019-03-17
        • 2014-11-19
        • 1970-01-01
        • 2018-06-04
        相关资源
        最近更新 更多