2014-05-13 1 views
0

데이터베이스에 DateTime을 UTC로 작성하고이를 검색시 사용자 시간대로 변환해야합니다. 모든 사용자는 데이터베이스에 자신의 시간대를 설정합니다.부모님 __construct가 final 인 동안 symfony2에서 Doctrine DBAL DateTimeType 확장하기

솔루션 : 확장 Doctrine\DBAL\Types\DateTimeTypehere 그래서 항상 UTC를 고집 할 필요 할 때 나뭇 가지를 통해 프리젠 테이션 계층에서 사용자 시간대로 다시 변환 설명한다.

문제 : 제안 된 방법은 기본 시간대의 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"] 

그러나 예외 : 컴파일 오류 : 최종 무시할 수 없습니다

global $kernel; 
$tz = $kernel->getContainer()->get('security.context')->getToken()->getUser()->getTimezone(); 
: 방법 교리 \ DBAL \ 유형 \ 유형 :: __ 구조()

는 심지어 같은 나쁜 나쁜 방법에 의존 한

이것은 모든 상상할 수있는 방식으로 잘못되었지만 어떤 이유로 든 getToken()이 때때로 설정되기도하고 때로는 요청 전반에 걸쳐 나타나지 않기 때문에 나는이 문제의 신뢰성에 심각한 의구심을 가지고 있습니다.

아이디어가 있으십니까?

답변

0

엔티티에서 해 보셨습니까?

getDate() (또는 getter가 무엇이든간에) 사용자 시간대를 가져야합니다. 그리고 세터 (setDate())에서 다시 UTC 할 시간을 설정해야합니다.

예제를 제공 할 수 있도록 엔터티 코드를 작성하십시오.

+0

나는 그것을 고려했지만 모든 엔티티에서 엄청난 코드 중복이 발생합니다 ... 다른 방법으로 발견되었습니다. (http://jeremycook.ca/2012/06/24/normalising-datetimes-with-doctrine- 이벤트 /) 실제로 그렇게하지만 그것은 무엇을 위해 지나치게 복잡해 보입니다. 어쨌든 고마워! –

관련 문제