以下ZendCasts cast显示了在zend框架环境中使用doctrine 2的方法
使用此配置,如何使连接使用utf-8字符集,以便"SET NAMES 'utf8'"
的魔力发生?
我真正想要的是使用application.ini文件配置它的方法
如果使用此配置无法实现,那么如何通过代码完成? Bootstratp文件中的_initDoctrine
方法?
谢谢。
更新
它似乎有一个后连接事件处理这个,但我不知道如何通过application.ini设置它(如果可能的话)。
如果没有,我可以通过bootstrap方法进行设置吗?在依赖Bisna库时,引导方法是否会在任何其他学说连接代码运行之前运行?
答案 0 :(得分: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);
我正在使用以下自定义引导程序资源来初始化原则,因此$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 = '...'
....
答案 1 :(得分:22)
对我来说很好用
resources.doctrine.dbal.connections.default.parameters.driverOptions.1002 = "SET NAMES 'UTF8'"
1002
是PDO::MYSQL_ATTR_INIT_COMMAND
的整数值:
连接MySQL服务器时执行的命令。将 重新连接时自动重新执行。 注意,此常量只能在构造new时在driver_options数组中使用 数据库句柄。
答案 2 :(得分:10)
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'
)
),
)
)
)
);
答案 3 :(得分: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
中答案 4 :(得分:1)
由于这是针对Doctrine 2的,ZendCasts正在使用Bisna,我相信你可以将它添加到你的configuration.ini文件中
resources.doctrine.dbal.connections.default.parameters.driverOptions.charset = "utf8"
我不确定如何测试它是否坚持但请告诉我们。
答案 5 :(得分:0)
您可以将默认表格字符集设置为utf8:
// Create new Doctrine Manager instance
$doctrineManager = Doctrine_Manager::getInstance();
// Set charset to UTF8
$doctrineManager->setAttribute(
Doctrine_Core::ATTR_DEFAULT_TABLE_CHARSET,
'utf8'
);
引用:
Bootstratp文件中的_initDoctrine方法?
是
答案 6 :(得分:0)
对于LoSo库和Doctrine 2和MySQL添加
resources.doctrine2.connection.driverOptions.1002 = "SET NAMES 'UTF8'"
到你的application.ini
答案 7 :(得分:-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"
我认为你可以做类似的事情