web-dev-qa-db-ja.com

Laravel応答の内容は、__ toString()を実装する文字列またはオブジェクトである必要があります。

スキル機能を実行したいのですができません。

Route.php

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

User.php

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

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

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;
    }
}
_

The Response content must be a string or object implementing __toString(), "object" given.」エラーが発生した/ settingsページにアクセスしたい。

ルートにdd()関数のリターンを追加しようとしましたが、すべてのJSONデータが表示されますが、$skills->get()$skill->set()がそのときに機能しませんでした。

編集:

Skills.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ı");
        }
    }
_
8

あなたがするとき

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

__ toString()メソッドを実装していないRelation定義オブジェクトを返しています。関連オブジェクトを返すために必要なものは

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

これにより、関連スキルを含むコレクションオブジェクトが返されます-これは適切にシリアル化されます。

6
jedrzej.kurylo

オブジェクト変数を介してget_object_vars($skills)以降のloopを使用できるかもしれません。例:

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

Route.phpでは、そのようなコレクションを返します

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

OR

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;
}

これが誰かに役立つことを願っています。

0
nensamuel