【问题标题】:How to define the use of utf-8 in Doctrine 2 in Zend Framework application.ini, when using Bisna使用Bisna时如何在Zend Framework application.ini中定义Doctrine 2中utf-8的使用
【发布时间】:2011-03-22 12:16:36
【问题描述】:

下面的ZendCasts cast,展示了在 zend 框架环境中使用学说 2 的方法。
使用此配置,我怎样才能使连接使用 utf-8 字符集,这样"SET NAMES 'utf8'" 的魔力才会发生?

我真正在寻找的是一种使用 application.ini 文件配置它的方法。
如果使用此配置无法做到这一点,那么如何通过代码来完成? Bootstratp 文件中的_initDoctrine 方法?

谢谢。

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

【问题讨论】:

    标签: zend-framework character-encoding doctrine doctrine-orm


    【解决方案1】:

    如果您不使用 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 = '...'
    ....
    

    【讨论】:

    • 你就是男人!谢谢! “How to set Doctrine2 to connect to MySql using UTF-8 charset”的解决方案。
    【解决方案2】:

    适合我

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

    1002PDO::MYSQL_ATTR_INIT_COMMAND的整数值:

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

    【讨论】:

      【解决方案3】:

      这对我有用。 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'
                          )
      
                      ),
      
                  )
              )
          )
      );
      

      【讨论】:

      • 谢谢。我建议将1002 =&gt; 'SET NAMES utf8'这一行改成PDO::MYSQL_ATTR_INIT_COMMAND =&gt; 'SET NAMES utf8'
      • 谢谢。也适用于 Zend Expressive 3。
      【解决方案4】:

      可以通过 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 中

      【讨论】:

        【解决方案5】:

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

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

        我不确定如何测试它是否粘住,但请告诉我们。

        【讨论】:

        【解决方案6】:

        您可以像这样将默认表格字符集设置为 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 方法?

        是的。

        【讨论】:

          【解决方案7】:

          对于 LoSo 库和 Doctrine 2 和 MySQL 添加

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

          到你的 application.ini

          【讨论】:

            【解决方案8】:

            我的引导程序中有这个:

                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"
            

            我认为你可以做类似的事情

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-10-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-12-10
              • 2011-11-07
              • 1970-01-01
              相关资源
              最近更新 更多