Я пытаюсь добавить то, на что я надеюсь, простой модуль голосования для сообщений и комментариев. «Соединение» - это тип сообщения в моем приложении. Пользователи могут проголосовать вверх или вниз по соединению или комментарию.Полиморфная система голосования 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);
}
Вы пробовали var_dump или print_r, чтобы убедиться, что ваши переменные содержат то, что, по вашему мнению, они делают? – sisve
Привет @SimonSvensson, спасибо за ваш ответ. Да, я проверял вещи практически во всех соответствующих моментах, которые я могу придумать, используя Xdebug. Я думаю, насколько я могу судить, штуки на месте. Есть ли определенная переменная (ы), которую вы предлагаете мне проверить? – jakeharris
Я только что протестировал его со всем вашим кодом на примере локали laravel, и все это работало безупречно. Есть ли трассировка стека в любой полезной информации? – lukasgeiter