У меня есть следующий объект в моем проекте Symfony 4
class Post
{
/**
* @var string
*
* @ORM\Column(name="date_string", type="string", length=11)
*/
private $dateString;
public funtion getDateString()
{
return $this->dateString;
}
}
Я знаю, я мог бы использовать \ DateTime для этого, но это не имеет значения для моего случая;)
Что я хочу, чтобы преобразовать строку даты в зависимости от локализации пользователя. Поэтому я создал новый перевод и использовал ключ «dateFormat», чтобы установить формат даты для каждой локализации.
messages.en.yaml
dateFormat: "m/d/Y"
messages.de.yaml
dateFormat: "d.m.Y"
Мой вопрос: как лучше получить отформатированную строку даты? Я написал метод репозитория, но мне не нравится это решение. Когда я обращаюсь к методу, мне всегда нужно получить хранилище, и его неудобно использовать в шаблонах Twig.
PostRepository:
public function getFormattedDateString(Post $post): string
{
$dateTime = new \DateTime($post->getDateString());
$dateFormat = $this->translator->trans('dateFormat');
return $dateTime->format($dateFormat);
}
Скорее я хотел бы использовать метод непосредственно из сущности. Что-то вроде этого:
$ Post-> getFormattedDate ();
Но это не сработает, потому что мне нужно ввести TranslatorInterface в сущность. Это отстой. Или есть способ изменить результат метода getDateString ()? (аннотации?)
Как бы вы решили задачу? большое спасибо
Я полагаю, вы не хотите использовать IntlDateFormatter
и хочу заново изобрести способ перевести дату.
Я бы сделал услугу LocaleDateFormatter
чем вы можете использовать, когда вам нужно перевести дату в форматированный Дата локали (и фильтр ветки, чтобы использовать его в шаблоне ветки)
__construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
public function getFormattedDateString($dateString): string
{
$dateTime = new \DateTime(dateString);
$dateFormat = $this->translator->trans('dateFormat');
return $dateTime->format($dateFormat);
}
Может быть, вы могли бы создать сервис, который будет предоставлять функцию, которая будет принимать вашего пользователя в качестве параметра. Это разрешит нужную вам строку даты.
Например, вы можете создать DateFormatResolverInterface
, что бы реализовать resolveFormat(User $user)
, Затем создайте RequestLocaleDateFormatResolver
класс, который реализует интерфейс, и разрешить формат внутри resolveFormat()
функция. Вы всегда можете изменить способ разрешения формата, создав new class
тот implements the interface
,
Затем используйте это всякий раз, когда вам нужно: $this->get('acme.date_format_resolver')->resolveFormat($user);
ИЛИ ЖЕ
$this->get(DateFormatResolverInterface::class)->resolveFormat($user);
Надеюсь это поможет.