Как определить использование utf-8 в Doctrine 2 в Zend Framework application.ini при использовании Bisna - PullRequest
19 голосов
/ 22 марта 2011

Следующий приведенный ZendCasts , показывает способ использования доктрины 2 в среде Zend Framework.
Используя эту конфигурацию, как я могу сделать так, чтобы соединение использовало кодировку utf-8, чтобы волшебство "SET NAMES 'utf8'" случилось?

Что я действительно ищу, так это способ настроить его с помощью файла application.ini.
Если это невозможно при использовании этой конфигурации, как это можно сделать с помощью кода? _initDoctrine метод в файле Bootstratp?

Спасибо.

UPDATE
Похоже, есть событие post connect, которое обрабатывает это, но я не вижу, как я могу настроить его через application.ini (если вообще возможно).
Если нет, могу ли я установить его с помощью метода начальной загрузки? Запустится ли метод начальной загрузки до запуска любого другого кода подключения к доктрине, если использовать библиотеку Bisna?

Ответы [ 8 ]

92 голосов
/ 17 мая 2011

Если вы не используете Bisna, вы можете просто сделать что-то вроде следующего:

Передать данные конфигурации напрямую в параметры подключения EntityManager (хотя driverOptions не задокументировано)

// $options is a simple array to hold your data
$connectionOptions = array(
    'driver'   => $options['conn']['driv'],
    'user'     => $options['conn']['user'],
    'password' => $options['conn']['pass'],
    'dbname'   => $options['conn']['dbname'],
    'host'     => $options['conn']['host'],
    'charset'  => 'utf8',
    'driverOptions' => array(
        1002 => 'SET NAMES utf8'
    )
);

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);

Я использую следующий пользовательский ресурс начальной загрузки для инициализации доктрины, поэтому $options находится в application.ini и доступен там по $this->getOptions();

// \library\My\Application\Resource\Doctrine.php
class My_Application_Resource_Doctrine extends Zend_Application_Resource_ResourceAbstract
 {

    public function init()
    {
       $options = $this->getOptions();
       $config = new \Doctrine\ORM\Configuration();
       //doctrine autoloader, config and other initializations
       ...
       $connectionOptions = array(
               .... //see above
       );
       $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
       $registry = Zend_Registry::getInstance();
       $registry->em = $em;
       return $em;
    }
}

Он автоматически загрузится, если вы поместите приложение.ini

resources.doctrine.conn.host = '127.0.0.1'
resources.doctrine.conn.user = '...'
resources.doctrine.conn.pass = '...'
....
22 голосов
/ 30 марта 2011

отлично работает у меня

resources.doctrine.dbal.connections.default.parameters.driverOptions.1002 = "SET NAMES 'UTF8'"

1002 - это целое значение PDO::MYSQL_ATTR_INIT_COMMAND:

Команда для выполнения при подключении к серверу MySQL. Будет автоматически повторяться при переподключении. Обратите внимание, что эта константа может использоваться только в массиве driver_options при создании нового дескриптор базы данных.

11 голосов
/ 30 января 2015

это сработало для меня.config/autoload/doctrine.local.php

<?php
return array(
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
                'params' => array(
                    'host' => 'localhost',
                    'port' => '3306',
                    'user' => '...',
                    'password' => '...',
                    'dbname' => '...',

                    'driverOptions' => array(
                        \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
                    )

                ),

            )
        )
    )
);
4 голосов
/ 27 апреля 2011

Можно добавить его через application.ini, при условии, что вы используете ZendX_Doctrine2 (в https://github.com/mridgway/ZendX_Doctrine2) с MySQL.

Тогда вот строка, которая вам нужна в application.ini:

resources.entitymanagerfactory.connectionOptions.driverOptions.1002 = "SET NAMES utf8"

(1002 == PDO :: MYSQL_ATTR_INIT_COMMAND)

Не забудьте правильно установить

default-character-set=utf8

в вашем my.cnf

1 голос
/ 22 марта 2011

Так как это для Doctrine 2, а ZendCasts использует Bisna, я верю , вы можете просто добавить это в свой файл configuration.ini

resources.doctrine.dbal.connections.default.parameters.driverOptions.charset = "utf8"

Я не совсем уверен, как проверить, торчит ли он или нет, но дайте нам знать.

0 голосов
/ 10 апреля 2012

Для библиотеки LoSo, Doctrine 2 и MySQL добавьте

resources.doctrine2.connection.driverOptions.1002 = "SET NAMES 'UTF8'"

в ваше application.ini

0 голосов
/ 22 марта 2011

Вы можете установить кодировку таблицы по умолчанию следующим образом: utf8:

// Create new Doctrine Manager instance
$doctrineManager = Doctrine_Manager::getInstance();

// Set charset to UTF8
$doctrineManager->setAttribute(
    Doctrine_Core::ATTR_DEFAULT_TABLE_CHARSET,
    'utf8'
);

Цитата:

метод _initDoctrine в файле Bootstratp?

Да.

0 голосов
/ 22 марта 2011

У меня есть это в моей начальной загрузке:

    protected function _initDoctrineLibrary()
{
    require_once('Doctrine/Doctrine.php');
    $this->getApplication()->getAutoloader()->pushAutoloader(array('Doctrine', 'autoload'),'Doctrine');

    $manager = Doctrine_Manager::getInstance();
    $manager->setAttribute(
        Doctrine::ATTR_MODEL_LOADING,
        Doctrine::MODEL_LOADING_CONSERVATIVE
    );
    $config = $this->getOption('doctrine');
    $conn = Doctrine_Manager::connection($config['dsn'],'doctrine');
    $conn->setAttribute(Doctrine::ATTR_USE_NATIVE_ENUM, true);
    return $conn;
}

где в application.ini вы видите

doctrine.dsn = "mysql://user:password@host/databasename"

Я думаю, что вы можете сделать что-то подобное

...