سلام
دوستان به نظر شما استفاده از cast ها در model های لاراول به روش زیر درسته؟
چون هر دفعه توی نمایش تاریخ ها باید از تایع jdate استفاده میکردم گفتم بیام با cast ها هندلش کنم.
<?php
namespace App\Casts;
use Carbon\Carbon;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Database\Eloquent\Model;
use Morilog\Jalali\Jalalian;
class Jdate implements CastsAttributes
{
/**
* Cast the given value.
*
* @param array<string, mixed> $attributes
*/
public function get(Model $model, string $key, mixed $value, array $attributes): mixed
{
if (is_null($value)) return null;
// convert to Jalalian date
if ($value instanceof Carbon) {
return Jalalian::fromCarbon($value->timezone('Asia/Tehran'));
}
return Jalalian::fromCarbon(Carbon::parse($value)->timezone('Asia/Tehran'));
}
/**
* Prepare the given value for storage.
*
* @param array<string, mixed> $attributes
*/
public function set(Model $model, string $key, mixed $value, array $attributes): mixed
{
if (is_null($value)) return null;
// convert to Carbon date
if ($value instanceof Jalalian) {
$value = $value->toCarbon();
}
return $value;
}
}
و سوال دومم اینه که من تایم زون رو در کانفیگ ها Asia/Tehran ست کردم ولی فقط دو فیلد createdat و updatedat رو 3/5 ساعت عقب تر بهم نشون میده ( فکر میکنم دوبار تایم زون رو روش اعمال میکنه ولی وقتی مثل زیر مجدد تایم زون رو روش ست میکنم درست میشه ( توی دیتابیس به درستی ذخیره میشه)
یه سرچی زدم انگار مربوط به serializeDate میشه که اگه در زیر ببینید لاراول خودش اومده متد toJSON رو استفاده کرده که باعث میشه اینطوری بشه میتونستم این تابع رو توی هر model ست کنم ولی کار درستی نبود بنظرم و اومدم از همون تایم زون توی cast استفاده کردم، راه دیگه ای هست؟
protected function serializeDate(DateTimeInterface $date)
{
return $date instanceof DateTimeImmutable ?
CarbonImmutable::instance($date)->toJSON() :
Carbon::instance($date)->toJSON();
}
( کد بالا مربوط به خود لاراول هست)
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟