2015-08-02 13 views
8

Chcę uruchomić funkcję Skills, ale nie mogę jej użyć.Laravel Treść odpowiedzi musi być ciągiem znaków lub obiektem implementującym __toString(), "obiekt" pod numerem

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

chcę wejść na stronę/ustawienia mam "The Response content must be a string or object implementing __toString(), "object" given." błąd.

Próbowałem dodać powrót funkcji dd() w trasie, widzę wszystkie dane JSON, ale $skills->get(), $skill->set() nie działa w tym czasie.

Edit:

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

Odpowiedz

6

Kiedy robisz

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

wracasz obiekt definicji relacji, która nie wykona __toString() metody. Co trzeba by powrócić powiązanego obiektu jest

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

ta zwróci kolekcja Przedmiotem cotaining związanych umiejętności - będzie poprawnie odcinkach.

+0

Dzięki za Odpowiedź Próbuję ale chcę uruchomić \ App \ użytkownik :: first() -> umiejętności() -> set ("Kopiuj", "100"); return \ App \ User :: first() -> skills; Nie ustawia się :) –

+0

A co powinna zrobić funkcja set()? Jakiej wersji Laravel używasz? Nie widzę czegoś podobnego w kodzie Laravela –

+0

Dzielę się kodami, używam laravel 5 –

1

Możliwe, że można przejść z get_object_vars($skills) i później loop poprzez zmienne obiektowe. Przykład:

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

w Route.php, zwraca kolekcję jak tak

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

LUB

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

A na ciebie modelu User.php można czynnik swoje kod mówi:

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

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

Mam nadzieję, że to pomoże komuś.

Powiązane problemy