在使用Bisna时,如何在Zend Framework application.ini中定义Doctrine 2中utf-8的使用

问题描述 投票:19回答:8

以下ZendCasts cast显示了在zend框架环境中使用doctrine 2的方法。 使用此配置,如何使连接使用utf-8字符集,以便"SET NAMES 'utf8'"的魔力发生?

我真正想要的是使用application.ini文件配置它的方法。 如果使用此配置无法实现,那么如何通过代码完成? Bootstratp文件中的_initDoctrine方法?

谢谢。

UPDATE 它似乎有一个post连接事件来处理这个,但我不知道如何通过application.ini设置它(如果可能的话)。 如果没有,我可以通过bootstrap方法进行设置吗?在依赖Bisna库时,引导方法是否会在任何其他学说连接代码运行之前运行?

zend-framework character-encoding doctrine doctrine-orm
8个回答
22
投票

对我来说很好

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

1002PDO::MYSQL_ATTR_INIT_COMMAND的整数值:

连接MySQL服务器时执行的命令。重新连接时会自动重新执行。注意,在构造新的数据库句柄时,此常量只能在driver_options数组中使用。


92
投票

如果您不使用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);

我正在使用以下自定义bootstrap资源来初始化doctrine因此$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;
    }
}

如果您输入application.ini,它将自动引导

resources.doctrine.conn.host = '127.0.0.1'
resources.doctrine.conn.user = '...'
resources.doctrine.conn.pass = '...'
....

11
投票

这对我有用。 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
投票

如果您使用ZendX_Doctrine2(在https://github.com/mridgway/ZendX_Doctrine2)和MySQL,可以通过application.ini添加它。

然后这是application.ini中需要的行:

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

(1002 == PDO :: MYSQL_ATTR_INIT_COMMAND)

别忘了正确设置

default-character-set=utf8

在你的my.cnf


1
投票

由于这是针对Doctrine 2的,ZendCasts正在使用Bisna,我相信你可以将它添加到你的configuration.ini文件中

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

我不确定如何测试它是否坚持但是让我们知道。


0
投票

您可以将默认表格字符集设置为utf8:

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

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

引用:

Bootstrap文件中的_init Doctrine方法?

是。


0
投票

对于LoSo库和Doctrine 2和MySQL添加

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

到您的application.ini


-1
投票

我在我的引导程序中有这个:

    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"

我想你可以做类似的事情

© www.soinside.com 2019 - 2024. All rights reserved.