在父级__construct为final时,在Symfony2中扩展Doctrine DBAL DateTimeType

时间:2014-05-13 18:07:59

标签: symfony doctrine-orm

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

解决方案:按照here所述扩展Doctrine\DBAL\Types\DateTimeType,以便它始终以UTC格式存在,并在需要时通过Twig将其转换回表示层中的用户时区。< / p>

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

//TreasureForge\CoreBundle\DoctrineExtensions\DBAL\Types

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

treasure_forge.core_bundle.utc_datetime_extension:
    class: TreasureForge\CoreBundle\DoctrineExtensions\DBAL\Types\UTCDateTimeType
    arguments: ["@security.context"]

但它抛出:编译错误:无法覆盖最终方法Doctrine \ DBAL \ Types \ Type :: __ construct()

我甚至采用了糟糕,糟糕的方法,如:

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您是否尝试在实体中执行此操作?

在你的getDate()(或任何你的getter被叫)中,你应该获得用户时区。再次在setter(setDate())中你应该设置你所拥有的UTC时间。

请编写您的实体代码以便提供示例。