2014-12-23 3 views
1

Я пытаюсь добавить то, на что я надеюсь, простой модуль голосования для сообщений и комментариев. «Соединение» - это тип сообщения в моем приложении. Пользователи могут проголосовать вверх или вниз по соединению или комментарию.Полиморфная система голосования Laravel с пространствами имен

Проблема, с которой я столкнулся, заключается в попытке присоединить голосование к соединению. Я получаю эту ошибку: Class name must be a valid object or a string.

Вот строка коды вопроса:

$voteToCast = $vote->voteable()->associate($voteable); 

Я уверен, за $ voteable var является экземпляром ретивого/красноречивых моделей, поэтому я могу только предположить, ошибка кроется в пути я Пространство имен мои модели или какая-то жалкая опечатка, я слишком слеп, чтобы видеть. Любая помощь будет принята с благодарностью.

Спасибо!

соединения Модель (тип поста):

... 

public function votes() 
{ 
    return $this->morphMany('Acme\Votes\Vote', 'voteable'); 
} 

И Голосов Модель:

/* Votes Model */ 

namespace Acme\Votes; 

use Illuminate\Database\Eloquent\Model; 
use LaravelBook\Ardent\Ardent; 

class Vote extends Ardent { 

    protected $table = 'votes'; 

    protected $fillable = [ 
     'value', 
     'votable_id', 
     'voteable_type' 
    ]; 

    /** 
    * Establish the polymorphic relationship 
    * 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsTo 
    */ 
    public function voteable() 
    { 
     return $this->morphTo(); 
    } 

    public function users() 
    { 
     return $this->belongsTo('Acme\\Users\\User'); 
    } 

    /** 
    * Vote the item up 
    * 
    * @param Model $voteable 
    * @return mixed 
    */ 
    public static function up(Model $voteable) 
    { 
     return (new static)->cast($voteable, 1); 
    } 

    /** 
    * Vote the item down 
    * 
    * @param Model $voteable 
    * @return mixed 
    */ 
    public static function down(Model $voteable) 
    { 
     return (new static)->cast($voteable, -1); 
    } 

    /** 
    * Execute the vote 
    * 
    * @param Model $voteable 
    * @param int $value 
    * @return bool 
    */ 
    protected function cast(Model $voteable, $value = 1) 
    { 
     if (!$voteable->exists) return false; 

     $vote = new static; 
     $vote->value = $value; 

     $voteToCast = $vote->voteable()->associate($voteable); 
     $voteToCast->save(); 
    } 

    /** 
    * Restrict the votes so the absolute value is 1 
    * 
    * @param $value 
    */ 
    public function setValueAttribute($value) 
    { 
     $this->attributes['value'] = ($value == -1) ? -1 : 1; 
    } 
} 

Голосов Контроллер:

... 

public function cast($connection) 
{ 

    $voteable = Connection::findOrFail($connection); 

    if (Input::get('value' < 1)){ 
     return Vote::down($voteable); 
    } 

    return Vote::up($voteable); 

} 
+0

Вы пробовали var_dump или print_r, чтобы убедиться, что ваши переменные содержат то, что, по вашему мнению, они делают? – sisve

+0

Привет @SimonSvensson, спасибо за ваш ответ. Да, я проверял вещи практически во всех соответствующих моментах, которые я могу придумать, используя Xdebug. Я думаю, насколько я могу судить, штуки на месте. Есть ли определенная переменная (ы), которую вы предлагаете мне проверить? – jakeharris

+0

Я только что протестировал его со всем вашим кодом на примере локали laravel, и все это работало безупречно. Есть ли трассировка стека в любой полезной информации? – lukasgeiter

ответ

0

После некоторых более устранения неполадок, это, кажется, проблема с тем, как Ardent обрабатывает отношения. Я смог использовать Eloquent на моей модели Vote вместо Ardent, и механизм голосования теперь работает безупречно.

Смежные вопросы