用 Laravel 生成 JSON Feed(獻給站長)

JokerLinly發表於2017-05-24

file

這篇文章的內容應用範圍不是很廣,但是隻是瞭解 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:

參考連結:https://laravel-news.com/generate-a-json-f...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Stay Hungry, Stay Foolish.

相關文章