У меня есть пользователи часовой пояс (в таблице users
DB есть столбец timezone
), и я хочу отобразить все $dates
атрибуты на все модели в часовом поясе пользователя, если аутентифицирован .
Я пытаюсь найти элегантный способ сделать это ... В идеале, когда в Blade что-то подобноеviews:
{{ $post->created_at }}
OR
{{ $post->created_at->format('h:i:s A') }}
... для аутентифицированных пользователей это будет автоматически в их часовых поясах.
Как бы вы справились с этим?
Я думаю о создании одной черты (например, app/Traits/UserTimezoneAware.php
) и размещении там аксессоров , которые просто вернут Carbon::createFromFormat('Y-m-d H:i:s', $value)->timezone(auth()->user()->timezone)
, если текущий пользователь аутентифицирован.Например:
<?php
namespace App\Traits;
use Carbon\Carbon;
trait UserTimezoneAware
{
/**
* Get the created_at in the user's timezone.
*
* @param $value
* @return mixed
*/
public function getCreatedAtAttribute($value)
{
if (auth()->check()) {
return Carbon::createFromFormat('Y-m-d H:i:s', $value)->timezone(auth()->user()->timezone);
}
return Carbon::createFromFormat('Y-m-d H:i:s', $value);
}
/**
* Get the updated_at in the user's timezone.
*
* @param $value
* @return mixed
*/
public function getUpdatedAtAttribute($value) { ... }
}
Но я не уверен, хорошо это или плохо делать (чтобы создать доступ к атрибутам Laravel $dates
)?
Кроме того, модели будут иметь различные атрибуты, указанные в массиве $dates
: например, модель User
может иметь:
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = [
'created_at',
'updated_at',
'last_login_at'
];
и Post
модельможет иметь:
protected $dates = [
'created_at',
'updated_at',
'approved_at',
'deleted_at'
];
Можно ли динамически создавать аксессоры в признаке на основе атрибутов, указанных в массиве $dates
модели, использующей эту черту?
Или, может быть, есть лучший способ справиться с этим без аксессуаров?