Объект не реализует `Spatie \ Feed \ Feedable`

Я получаю Объект не реализует 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',
],
],
];

Скриншот ошибки

Кто-нибудь может мне с этим помочь.

заранее спасибо. 🙂

0

Решение

Ваш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: Вы должны использовать красноречивые и красноречивые отношения.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]