데이터베이스에 DateTime을 UTC로 작성하고이를 검색시 사용자 시간대로 변환해야합니다. 모든 사용자는 데이터베이스에 자신의 시간대를 설정합니다.부모님 __construct가 final 인 동안 symfony2에서 Doctrine DBAL DateTimeType 확장하기
솔루션 : 확장 Doctrine\DBAL\Types\DateTimeType
here 그래서 항상 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()이 때때로 설정되기도하고 때로는 요청 전반에 걸쳐 나타나지 않기 때문에 나는이 문제의 신뢰성에 심각한 의구심을 가지고 있습니다.
아이디어가 있으십니까?
나는 그것을 고려했지만 모든 엔티티에서 엄청난 코드 중복이 발생합니다 ... 다른 방법으로 발견되었습니다. (http://jeremycook.ca/2012/06/24/normalising-datetimes-with-doctrine- 이벤트 /) 실제로 그렇게하지만 그것은 무엇을 위해 지나치게 복잡해 보입니다. 어쨌든 고마워! –