Установите переменную сеанса MySQL - часовой пояс - используя Doctrine 1.2 и Zend Framework - PullRequest
2 голосов
/ 26 ноября 2010

Получил веб-приложение Zend Framework с использованием Doctrine 1.2 для подключения к серверу MYSQL 5.1.

Большинство данных необходимо вводить и отображать в местном часовом поясе. Поэтому, следуя совету здесь , я бы хотел (я думаю) настроить PHP и MySQL на использование UTC, а затем я выполню преобразование в местное время для отображения и в UTC до вставки / обновления. [Если это совершенно глупо, я рад услышать лучший подход.]

Итак, как мне сказать Doctrine, чтобы установить сеанс MySQL в UTC? По сути, как я могу сказать Doctrine для выполнения команды MySQL SET SESSION time_zone = 'UTC'; при открытии соединения?

Заранее спасибо!

1 Ответ

3 голосов
/ 26 ноября 2010

Похоже, что это можно сделать, прикрепив к Doctrine_Connection объекту Doctrine_EventListener методом postConnect().

Doctrine ORM для PHP - Создание нового слушателя

Что-то вроде:

class Kwis_Doctrine_EventListener_Timezone extends Doctrine_EventListener
{
    protected $_timezone;

    public function __construct($timezone = 'UTC')
    {
        $timezone = (string) $timezone;
        $this->_timezone = $timezone;
    }

    public function postConnect(Doctrine_Event $event)
    {
        $conn = $event->getInvoker();
        $conn->execute(sprintf("SET session time_zone = '%s';", $this->_timezone));
    }
}

[Использование sprintf() здесь, вероятно, любительское, ноЯ не мог понять, как сделать правильное связывание параметров.(смущенный смайлик).]

Тогда в моем приложении Bootstrap.php у меня есть что-то вроде:

protected function _initDoctrine()
{
    // various operations relating to autoloading
    // ..

    $doctrineConfig = $this->getOption('doctrine');

    $manager = Doctrine_Manager::getInstance();
    // various boostrapping operations on the manager
    // ..

    $conn = Doctrine_Manager::connection($doctrineConfig['dsn'], 'doctrine');
    // various boostrapping operations on the connection
    // ..

    // Here's the good stuff: Add the EventListener
    $conn->addListener(new Kwis_Doctrine_EventListener_Timezone());

    return $conn;
}

[Одно немного не по теме примечание: на моей локальной машине разработки я держалнатолкнулся на ошибку MySQL, в которой часовой пояс, в который я не вошел, не был принят.Оказывается, что стандартная установка MySQL создает все таблицы часовых поясов в базе данных mysql, но фактически не заполняет их;вам нужно заполнить их отдельно.Больше информации на сайте MySQL .]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...