這篇文章的內容應用範圍不是很廣,但是隻是瞭解 Feed 是一個什麼東西的話,還是可以看看的。
JSON Feed 是一種新的基於 RSS feed 標準的 JSON 格式,通過去掉 XML 標準來簡化 feed 的建立。給你的網站建立這種 Feed 很簡單,它的 格式規範 寫得也是相當優雅。
簡單又簡潔:
{
"version": "https://jsonfeed.org/version/1",
"title": "My Example Feed",
"home_page_url": "https://example.org/",
"feed_url": "https://example.org/feed.json",
"items": [
{
"id": "2",
"content_text": "This is a second item.",
"url": "https://example.org/second-item"
},
{
"id": "1",
"content_html": "<p>Hello, world!</p>",
"url": "https://example.org/initial-post"
}
]
}
接下來用一個簡單的例子來設計一個這樣的 Feed。
獲取帖子列表
第一步是從資料庫中獲取記錄列表。假設這個網站最新的一些專案是存在「Posts」表中,那我們先使用 Eloquent 去獲取最新的 20 條記錄:
$posts = Post::limit(20)->get();
設定主要的 JSON Feed 資料
JSON Feed 規範有幾個可選的頂級欄位,如標題、Feed URL、站點圖示等。由於這些都不是動態的,我們得手動把它們新增到陣列中:
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'Example Feed',
'home_page_url' => 'https://example.org/',
'feed_url' => 'https://example.org/feed/json',
'icon' => 'https://example.org/xxxxx.png',
'favicon' => 'https://example.org/xxxxxx.png',
'items' => [],
];
這上面為空的 items
是用來儲存我們拿下來的最新的帖子。
新增 JSON Feed 的 Items
最後一步是迴圈遍歷第一步中拿下來的 $posts
,並將其新增到 items
陣列中。像這樣:
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://example.org/'.$post->uri,
'image' => $post->featured_image,
'content_html' => $post->parsed_content,
'date_published' => $post->created_at->tz('UTC')->toRfc3339String(),
'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
這上面唯一需要特別定製的是時間戳。上面利用了 Carbon 轉換為 UTC,然後再轉換為 JSON 規範要求的 RFC 3339 格式。
最終結果
下面是懶人專用的方法完整版:
public function json()
{
$posts = Post::active()->limit(20)->get();
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'Example Feed',
'home_page_url' => 'https://example.org/',
'feed_url' => 'https://example.org/feed/json',
'icon' => 'https://example.org/xxxxx.png',
'favicon' => 'https://example.org/xxxxx.png',
'items' => [],
];
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://example.org/'.$post->uri,
'image' => $post->featured_image,
'content_html' => $post->parsed_content,
'date_created' => $post->publishes_at->tz('UTC')->toRfc3339String(),
'date_modified' => $post->updated_at->tz('UTC')->toRfc3339String(),
'author' => [
'name' => $post->user->name
],
];
}
return $data;
}
這裡只需返回 $data
陣列,它會自動轉換為 JSON 格式。關於這件事情, Mateus Guimarães 還為此寫了個 擴充套件包~
猶豫著要不要翻譯因為感覺這玩意只有站長會用到~
嘛,就獻給所有使用 Laravel 開發的站長吧 :rose:
本作品採用《CC 協議》,轉載必須註明作者和本文連結