امیرحسین رحیمی
1 سال پیش توسط امیرحسین رحیمی مطرح شد
1 پاسخ

استفاده از cast در لاراول برای تاریخ شمسی

سلام
دوستان به نظر شما استفاده از 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();
    }

( کد بالا مربوط به خود لاراول هست)


ثبت پرسش جدید
امیرحسین رحیمی
تخصص : برنامه نویس بک‌اند
@ahr1384 1 سال پیش مطرح شد

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام