是的,你可以使用一個事件監聽器,掛在kernel.request
事件。
這裏是我的項目之一聽衆:
<?php
namespace Vendor\Bundle\AppBundle\Listener;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Doctrine\DBAL\Connection;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Observe;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Inject;
/**
* @Service
*/
class TimezoneListener
{
/**
* @var \Symfony\Component\Security\Core\SecurityContextInterface
*/
private $securityContext;
/**
* @var \Doctrine\DBAL\Connection
*/
private $connection;
/**
* @InjectParams({
* "securityContext" = @Inject("security.context"),
* "connection" = @Inject("database_connection")
* })
*
* @param \Symfony\Component\Security\Core\SecurityContextInterface $securityContext
* @param \Doctrine\DBAL\Connection $connection
*/
public function __construct(SecurityContextInterface $securityContext, Connection $connection)
{
$this->securityContext = $securityContext;
$this->connection = $connection;
}
/**
* @Observe("kernel.request")
*/
public function onKernelRequest()
{
if (!$this->securityContext->isGranted('ROLE_USER')) {
return;
}
$user = $this->securityContext->getToken()->getUser();
if (!$user->getTimezone()) {
return;
}
date_default_timezone_set($user->getTimezone());
$this->connection->query("SET timezone TO '{$user->getTimezone()}'");
}
}
@elnur,假設我的服務器設置爲「UTC」和用戶「美洲/加拉加斯」。使用您的解決方案,當用戶在某個實體字段中提交日期時間時會發生什麼?將日期時間與用戶時區(與用戶輸入的值相比沒有變化)或服務器時區(值更改爲與UTC時間相匹配)一起存儲? –
@David你應該只在你的數據庫中存儲基於UTC的時間/日期。這樣,您可以始終正確地爲用戶設置格式。 – Luke