したがって、現地時間での活動の日付を設定するオプションを表示したいが、それをsymfony標準としてUTCに保存する。 5つの異なるタイムゾーン値を持つ5つの異なるユーザーセグメントがあります。ユーザーはフォームで新しいアクティビティを設定できます。各ユーザーエンティティには独自のタイムゾーンが設定されています。私の質問はどこでコンバージョンを設定するのですか?私はユーザーエンティティをログインしているユーザーセッション状態にしています。Symfony buildForm datetimeをローカルに変換してからutcに戻す
私がformBuilderを呼び出すControllerActionでは、
formBuilderでは?
フォームビルダーはまだ私のために少しファジィですが、私はそこに多くのことが起こっていることを知っています。
formBuilderは、簡素化:
public function buildForm(FormBuilderInterface $builder, array $options)
{
//...
$builder->add('name');
$builder->add('startDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
$builder->add('endDate', DateTimeType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
)
);
//...
$builder->add('submit', SubmitType::class, array('attr' => array('class' => 'button')));
}
をControllerAction:
public function activityAction(Request $request, Activity $activity){
$variables = array();
/**
* TODO Determine User Local timezone and store as UTC
*
*/
$user = $this->get('security.token_storage')->getToken()->getUser();
$timezone = $user->getTimezone();
$activity = new Activity();
$form = $this->createForm(ActivityType::class, $activity);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$activity->setName($form->get('name')->getData());
/**
*
* Maybe here, (I've just realized)
* Because earlier, the form just handled the datetime without conversion
* And just stored them in the DB as they where
*
*/
// Example: $timezone = 'Europe/London';
$date = new DateTime();
$date->setTimestamp($form->get('startDate')->getData());
$date->setTimezone(new DateTimeZone($timezone));
$activity->setStartDate($date->format("Y-m-d H:i:s"));
$date = new DateTime();
$date->setTimestamp($form->get('endDate')->getData());
$date->setTimezone(new DateTimeZone($timezone));
$activity->setEndDate($date->format("Y-m-d H:i:s"));
$em = $this->getDoctrine()->getManager();
$em->persist($activity);
$em->flush();
}
elseif ($form->isSubmitted() && !$form->isValid()) {
$variables['message'] = 'Something went wrong!';
}
$variables["title"] = "Create Activty";
$variables["form"] = $form->createView();
return $this->render('AcmeBundle:SomeViews:activity.html.twig', $variables);
}
だから私は信じて、私はちょうど尋ねるために私を強制的に自分の質問に答えました。これは、あなたがそれを行う方法のコンベンション/ベストプラクティスですか?
ありがとう!私の開発マシンがCEST上にあり、本番サーバーがUTC上にあることに気づくまで、私は髪を引っ張っていました。しかし、これはトリックでした! – Conjak