Я получаю Объект не реализует Spatie\Feed\Feedable
ошибка и в
Файл Error.log: LOG.error: Объект не реализует
Spatie \ Feed \ Feedable {«exception»: {«subject»: null}}
мой NewsItem.php
код файла:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Spatie\Feed\Feedable;
use Spatie\Feed\FeedItem;
use Carbon;
use DB;
class NewsItem extends Model implements Feedable
{
public function toFeedItem()
{
return [
'id' => $this->id,
'title' => $this->title,
'summary' => $this->summary,
'updated' => $this->updated_at,
'link' => $this->link,
'author' => $this->author,
];
}
// app/NewsItem.php
public static function getFeedItems()
{
$query = DB::table('news')
->select('news.news_news_iid as id', 'pulse.city_pulse_title as title', 'news.news_description as summary', 'pulse.city_pulse_modified_on as updated_at', 'alias.url_alias_name as link', 'news.news_author_name as author')
->Join('city_pulse as pulse', 'pulse.city_pulse_city_pulse_iid', '=', 'news.news_news_id')
->Join('url_alias as alias', 'pulse.city_pulse_city_pulse_iid', '=', 'alias.url_alias_content_iid')
->where('alias.url_alias_content_type_iid', 9)
->whereIn('news.news_news_iid', [788, 785, 771, 802, 814])
->get()->toArray();
foreach ($query as $key => $value) {
$query[$key]->created_at = \Carbon::parse($value->updated_at)->format('dS F Y H:i a');
$query[$key]->link = 'http://ichangemycity.com/' . $value->link;
}
return $query;
}
}
мой Feed.php
код файла
<?php
return [
'feeds' => [
'main' => [
/*
* Here you can specify which class and method will return
* the items that should appear in the feed. For example:
* 'App\Model@getAllFeedItems'
*
* You can also pass an argument to that method:
* ['App\Model@getAllFeedItems', 'argument']
*/
'items' => 'App\Models\NewsItem@getFeedItems',
/*
* The feed will be available on this url.
*/
'url' => '/feed',
'title' => 'All newsitems on mysite.com',
],
],
];
Кто-нибудь может мне с этим помочь.
заранее спасибо. 🙂
ВашgetFeedItems
должен вернуть карту, содержащую элемент / экземпляр, который реализует FeedItem
интерфейс не array
ни stdclass
, Другими словами, вы должны использовать Eloquent, а не DB
запрос.
public static function getFeedItems()
{
return static::whereHas('urlAlias', function ($q) {
$q->where('url_alias_content_type_iid', 9);
})->->whereIn('news_news_iid', [788, 785, 771, 802, 814])->get();
}
Так как класс вышеупомянутого метода уже реализует это, предполагая, что уже есть отношения определено, что-то вроде приведенного выше примера, это то, что вы должны написать. Хотя join
Таблица не предлагается, eloquent дает гораздо больше преимуществ, кроме того, что она короче, и, конечно, более удобочитаема. Красноречивый может также мутировать атрибут / столбец, как будто вам все еще нужно что-то вроде as
псевдоним.
Вероятно, есть патч обезьяны, который, я думаю, должен работать, если вы не заинтересованы в использовании красноречивых отношений.
public static function getFeedItems()
{
$query = DB::table('news')
->select('news.news_news_iid as id', 'pulse.city_pulse_title as title', 'news.news_description as summary', 'pulse.city_pulse_modified_on as updated_at', 'alias.url_alias_name as link', 'news.news_author_name as author')
->Join('city_pulse as pulse', 'pulse.city_pulse_city_pulse_iid', '=', 'news.news_news_id')
->Join('url_alias as alias', 'pulse.city_pulse_city_pulse_iid', '=', 'alias.url_alias_content_iid')
->where('alias.url_alias_content_type_iid', 9)
->whereIn('news.news_news_iid', [788, 785, 771, 802, 814])
->get()->toArray();
$items = collect(); // create new collection
foreach ($query as $key => $value) {
$query[$key]->created_at = \Carbon::parse($value->updated_at)->format('dS F Y H:i a');
$query[$key]->link = 'http://ichangemycity.com/' . $value->link;
$instance = new static; // create new NewsItem model class
foreach($value as $attribute => $_value) {
$instance->{$attribute} = $_value; // copy available attribute/column and its value
}
$instance->exists = true; // tell this model is already exists, forcely
$items[$key] = $instance; // assign this model to the collection
}
return $items; // return the items containing this model class (which implements FeedItem interface)
}
TL; DR: Вы должны использовать красноречивые и красноречивые отношения.
Других решений пока нет …