Laravel 的响应内容必须是字符串或对象,实现 __toString(),“object”给定
Posted
技术标签:
【中文标题】Laravel 的响应内容必须是字符串或对象,实现 __toString(),“object”给定【英文标题】:Laravel The Response content must be a string or object implementing __toString(), "object" given 【发布时间】: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ı");
【问题讨论】:
【参考方案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以上是关于Laravel 的响应内容必须是字符串或对象,实现 __toString(),“object”给定的主要内容,如果未能解决你的问题,请参考以下文章
无法解码有效的 json 格式,响应内容必须是实现 __toString() 的字符串或对象,给定的“对象”
Symfony2 的响应内容必须是实现 __toString() 的字符串或对象,“boolean”给定
laravel : count(): 参数必须是数组或实现 Countable 的对象