在Symfony2中扩展Doctrine DBAL DateTimeType,而parent __construct是f



我需要将DateTime写入UTC数据库,并在检索时将其转换为用户时区。每个用户在数据库中都有自己的时区设置。

解决方案:像这里描述的那样扩展DoctrineDBALTypesDateTimeType,使其始终保持在UTC,并在需要时通过Twig在表示层将其转换回用户时区。

问题:建议的方法从系统默认时区转换UTC。要使其工作,我需要读取扩展DateTimeType中的实际用户时区并与之进行转换。所以…我执行通常的依赖注入并注入SecurityContext,因为它将用户实体与时区值保存在一起:

//TreasureForgeCoreBundleDoctrineExtensionsDBALTypes
private function __construct(SecurityContext $security)
{
   $this->tz = $security->getToken()->getUser()->getTimezone();
}

treasure_forge.core_bundle.utc_datetime_extension:
    class: TreasureForgeCoreBundleDoctrineExtensionsDBALTypesUTCDateTimeType
    arguments: ["@security.context"]

但是它抛出:编译错误:不能覆盖最终方法DoctrineDBALTypesType::__construct()

我甚至使用了非常糟糕的方法,比如:

global $kernel;
$tz = $kernel->getContainer()->get('security.context')->getToken()->getUser()->getTimezone();

这在任何可以想象的方式中都是错误的,但即使如此,无论出于何种原因,getToken()有时被设置,有时不在整个请求中设置,因此我对其可靠性存在严重怀疑。

任何想法?

你试过在实体中这样做吗?

在你的getDate()(或无论你的getter被称为什么)中,你应该获得用户时区。并且再次在setter (setDate())中,您应该将任何时间设置为UTC。

请编写您的实体代码,以便能够提供一个例子。

最新更新