محاسبه و نمایش اختلاف ساعت به سبک فیسبوک در لاراول و بلید

خوب به عنوان تجربه دوم از فریمورک لاراول؛ میخوام نحوه ی نمایش اختلاف زمان انتشار یک محتوا نسبت به زمان جاری به سبک و سیاق سایتهای امروزی مثل فیسبوک و اینستاگرام و ... و یا همین ویرگول خودمون که به جای تاریخ و ساعت دقیق انتشار مثلا مینویسند 10 ساعت قبل یا 5 دقیقه پیش و .... رو بهتون آموزش بدم.

محاسبه اختلاف زمان

همونطور که میدونید لاراول برای کار با تاریخ و ساعت داره از کلاس قدرتمند Carbon استفاده میکنه. و آموزش ما هم بر مبنای کاربن خواهد بود. برای نمایش این شکلی زمان کافیه توی مدل جایی که میخواین تاریخشو بخونین یه تابع دو خطی با محتوای زیر بنویسید. (همین رو میتونید کپی پیست کنید)

public function created_at_difference()
{
Carbon::setLocale('fa');
return Carbon::parse($this->created_at)->diffForHumans();
}

من اسم تابع رو گذاشتم created_at_difference و شما هر اسم دیگه ای دوست داشتین میتونید بذارید.

خط اول زبان رو روی فارسی قرار دادم تا موقع نمایش بجای کلمه ago بنویسه "قبل یا پیش" و خط دوم هم به کربن میگه که برو از جدول مدل جاری فیلد created_at رو بخون و بعد با استفاده از تابع diffForHumans اون رو با زمان جاری مقایسه کن و اختلافش رو برگردون.

خوب تا اینجای کار خیلی سریع و راحت و باحال اختلاف زمان حساب میشه و مرحله دوم نمایشش توی View هستش.

نمایش اختلاف زمان در تمپلیت انجین بلید

برای نمایش هم کافیه توی ویوو هرجایی که دوست دارید؛ یه شی از مدلتون بسازید و بعد شی رو از طریق کنترلر به اون ویوو بفرستید و این شکلی تابعی که نوشتیم رو توی blade صدا بزنیم تا نتیجه کار رو بهتون برگردونه.

{{ $discussion->created_at_difference() }}

توی خط کد بالا اسم شی من discussion هستش و شما با توجه به اسم شی ای که اینستنس می کنید دیگه باید اصلاحش کنید. این هم یه نمونه و نتیجه کار. هایلایت کردم براتون :)) نمایش اختلاف ساعت توی قسمت نظرات یک انجمن بازی.

فقط یه نکته خیلی ریز، بعد از انجام این کارها اگه همه چی اوکی بود احتمالا یه "از" اضافه بذاره پشت ساعت مثلا مینویسه 7 ساعت "پیش از" یا "قبل از". برای ویرایش فایل زبان فارسی کاربن به مسیر زیر برید و اصطلاحات دلخواهتون رو بذارید تا همه چیز مطابق میلتون بشه.

YOUR_PROJECT_PATH\vendor\nesbot\carbon\src\Carbon\Lang\fa.php

شاد باشید :)