JSON Feed استاندارد جدید برای فرمت بندی کردن یک JSON برپایه ی RSS feed هست که بر ساده سازی ساخت feed ها برای خاتمه دادن به استاندارد XML هست. پیاده سازی یک 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 برای یک سایت نمونه هست و شما میتونید نتایجش رو مشاهده کنید. برای مثال بیایید یک feed شبیه این پیاده سازی کنیم.
گرفتن لیستی از پست ها
قدم اول اینه که لیستی از رکورد ها رو از دیتابیس بگیریم. برای این سایت آیتم ها در جدول Posts ذخیره شدند و توسط Eloquent بیست رکورد آخر رو می گیریم :
$posts = Post::limit(20)->get();
پیاده سازی اطلاعات JSON Feed اصلی
JSON Feed مورد نظر شامل فیلدهایی مثل عنوان, URL, آیکون سایت و ... میشه. از اونجایی که اینها داینامیک نیستند من بصورت دستی به یک آرایه اضافه کردم :
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'Laravel News Feed',
'home_page_url' => 'https://laravel-news.com/',
'feed_url' => 'https://laravel-news.com/feed/json',
'icon' => 'https://laravel-news.com/apple-touch-icon.png',
'favicon' => 'https://laravel-news.com/apple-touch-icon.png',
'items' => [],
];
آیتم خالی تمام پست های ما رو نگه میداره.
افزودن JSON Feed آیتم ها
قدم نهایی اینه که بین تمام پست ها loop کنیم و به آرایه ی آیتم هامون اضافه کنیم. این یک مثال با استفاده از اطلاعات ماست :
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://laravel-news.com/'.$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
],
];
}
تنها بخشی که منحصر به فرده time stamps هست. من دارم با استفاده از ویژگی های Carbon به UTC و سپس به فرمت RFC 3339 که از نیازمندی های JSON spec هست, تبدیل می کنم.
نتایج نهایی
این متد کامل شده ی ماست :
public function json()
{
$posts = Post::active()->limit(20)->get();
$data = [
'version' => 'https://jsonfeed.org/version/1',
'title' => 'Laravel News Feed',
'home_page_url' => 'https://laravel-news.com/',
'feed_url' => 'https://laravel-news.com/feed/json',
'icon' => 'https://laravel-news.com/apple-touch-icon.png',
'favicon' => 'https://laravel-news.com/apple-touch-icon.png',
'items' => [],
];
foreach ($posts as $key => $post) {
$data['items'][$key] = [
'id' => $post->id,
'title' => $post->title,
'url' => 'https://laravel-news.com/'.$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;
}
نکته ای که باید توجه داشته باشید اینه که با لاراول ما حتما نباید header خاصی یا هرچیز دیگه ای رو set کنیم. فقط آرایه data$ رو برگردونید و این بصورت خودکار به فرمت JSON تبدیل میشه و header های مورد نیاز بوجود میاد.
اگر شما دوست دارید با استفاده از یک پکیج این کار رو انجام بدید یا دنبال قابلیت های پیشرفته تری می گردید, میتونید پکیج LaravelJsonFeed رو چک کنید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید