如何在CodeIgniter 3中安装Doctrine

时间:2015-10-19 08:31:56

标签: codeigniter doctrine-orm codeigniter-3

official guide未完成,others适用于CI2。

所以我给你一个我自己检查过的教程。

我知道SO鼓励用户to answer their own questions

2 个答案:

答案 0 :(得分:6)

安装条款

(以下说明经过修改:Doctrine 2 ORM’s documentation - Installation and Configuration

可以使用Composer安装Doctrine:

  1. 从命令行(例如Windows:开始> cmd),切换到应安装文件的文件夹(例如htdocs / my_project)。

  2. 使用Composer安装文件:

    一个。运行C:\>composer install doctrine/orm

    或:

    湾在composer.json文件中定义以下要求:

    {
    "require": {
        "doctrine/orm": "*"
      }
    }
    

    然后从命令行调用composer install

  3. Composer将安装一个文件夹vendor,其中包含许多子文件夹和数百个php文件。将此vendor文件夹移动到CodeIgniter应用程序树中。为简单起见,您可以将其放在此处:

    /application
        /config
        /controllers
        /libraries
           Doctrine.php <-- the doctrine bootstrap/wrapper file
        /third_party
    /vendor  <-- the folder installed by Composer. don't touch the files or folders below it -- install all together as one happy family.
        /bin
        /composer
        /doctrine
        /symfony
        autoload.php  <-- Doctrine.php opens this to load its files
    

    然后在您的图书馆文件Doctrine.php(见下文)中,您只需:

    require_once FCPATH . 'vendor/autoload.php';  // FCPATH is a CI constant specifies the path to the front controller.
    

    您也可以在其他位置安装vendor内的所有文件夹和文件,例如third_party,然后相应调整您的Doctrine.php。

    与CodeIgniter集成

    (以下说明经过修改:Doctrine 2 ORM’s documentation - Integrating with CodeIgniter

    1. 创建您的Doctrine库:在您的文件夹system/application/libraries中,创建一个名为Doctrine.php的文件,并将以下代码复制/粘贴到该文件中。这将成为Doctrine2实体管理器的包装器/引导程序。

      您的Doctrine.php库文件应如下所示(您可以根据需要对其进行自定义):

      <?php
      /**
      * Doctrine 2.4 bootstrap
      *
      */
      
      use Doctrine\Common\ClassLoader,
         Doctrine\ORM\Configuration,
         Doctrine\ORM\EntityManager,
         Doctrine\Common\Cache\ArrayCache,
         Doctrine\DBAL\Logging\EchoSQLLogger;
      
      
      class Doctrine {
      
         public $em = null;
      
         public function __construct()
         {
           // load database configuration from CodeIgniter
           require_once APPPATH.'config/database.php';
      
          // load Doctrine
          require_once FCPATH . 'vendor/autoload.php';
      
          // or, if you installed another way, you could:
          // require_once APPPATH.'third_party/Doctrine/Common/ClassLoader.php';
      
          // load the Doctrine classes        
          $doctrineClassLoader = new ClassLoader('Doctrine',  APPPATH.'libraries');
          // or, if installed in third_party: 
          // $doctrineClassLoader = new ClassLoader('Doctrine',  APPPATH.'third_party');
          $doctrineClassLoader->register();
          // load the entities
          $entityClassLoader = new ClassLoader('Entities', APPPATH.'models');
          $entityClassLoader->register();
          // load the proxy entities
          $proxiesClassLoader = new ClassLoader('Proxies', APPPATH.'models/proxies');
          $proxiesClassLoader->register();
          // load Symfony2 classes
          // this is necessary for YAML mapping files and for Command Line Interface (cli-doctrine.php)
          $symfonyClassLoader = new ClassLoader('Symfony',  APPPATH.'third_party/Doctrine');
          $symfonyClassLoader->register();
      
          // Set up the configuration
          $config = new Configuration;
      
          // Set up caches
          if(ENVIRONMENT == 'development'):  // set environment in index.php
              // set up simple array caching for development mode
              $cache = new \Doctrine\Common\Cache\ArrayCache;
          else:
              // set up caching with APC for production mode
              $cache = new \Doctrine\Common\Cache\ApcCache;  
          endif;
          $config->setMetadataCacheImpl($cache);
          $config->setQueryCacheImpl($cache);
      
          // set up annotation driver
          $driver = new \Doctrine\ORM\Mapping\Driver\PHPDriver(APPPATH.'models/Mappings');
          $config->setMetadataDriverImpl($driver);
      
          // Proxy configuration
          $config->setProxyDir(APPPATH.'/models/Proxies');
          $config->setProxyNamespace('Proxies');
      
          // Set up logger (recommended to remove for production)
          $logger = new EchoSQLLogger;
          $config->setSQLLogger($logger);
      
          $config->setAutoGenerateProxyClasses( TRUE ); // only for development
      
          // Database connection information
          $connectionOptions = array(
              'driver' => 'pdo_mysql',
              'user' =>     $db['default']['username'],
              'password' => $db['default']['password'],
              'host' =>     $db['default']['hostname'],
              'dbname' =>   $db['default']['database']
          );
      
          // Create EntityManager, and store it for use in our CodeIgniter controllers
          $this->em = EntityManager::create($connectionOptions, $config);
        }
      }
      
    2. 加载doctrine库:通过将Doctrine库添加到application/config/autoload.php文件中的数组来自动加载您的Doctrine库:

      &#39; $ autoload ['libraries'] = array('doctrine');`

    3. 或使用以下方法在任何其他库中手动加载它:

      $this->load->library('doctrine');

      如果您在applications/third_party中安装了Doctrine.php,则可以使用:

      $autoload[‘libraries’] = array('third_party/doctrine');

      $this->load->library('third_party/doctrine');

      下面的下一步中提供了一个示例控制器。

      设置命令行工具

      Doctrine附带了许多在开发过程中非常有用的命令行工具。

      检查Doctrine.php文件中是否存在这些行,以加载Symfony类以使用命令行工具(以及YAML映射文件):

      $symfonyClassLoader = new ClassLoader('Symfony', APPPATH.'third_party/Doctrine');
      $symfonyClassLoader->register();
      

      您需要将应用程序EntityManager注册到控制台工具,以通过在应用程序目录中创建cli-doctrine.php文件来使用这些任务,其中包含以下内容:

       <?php
      
       /**
       * Doctrine CLI bootstrap for CodeIgniter
       *
       */
      
       define('APPPATH', dirname(__FILE__) . '/');
      define('BASEPATH', APPPATH . '/../system/');
      define('ENVIRONMENT', 'development');
      
       require APPPATH.'libraries/Doctrine.php';
      
      $doctrine = new Doctrine;
      $em = $doctrine->em;
      
       $helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
          'db' => new \Doctrine\DBAL\Tools\Console\Helper\ConnectionHelper($em->getConnection()),
          'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($em)
      ));
      
       \Doctrine\ORM\Tools\Console\ConsoleRunner::run($helperSet);
      
       ?>
      

      现在通过PHP命令行运行此脚本,并且应该看到可用的命令列表。

      php cli-doctrine.php
      

      从数据库生成映射类:

      php cli-doctrine.php orm:convert-mapping --from-database annotation models/Entities
      

      如果您收到此错误: 致命错误:调用未定义的函数Doctrine \ Common \ Cache \ apc_fetch() 安装PHP的APC扩展:

      sudo apt-get install php-apc
      sudo /etc/init.d/apache2 restart
      

      对于生产模式: Doctrine建议在Doctrine.php中更改以下设置:    - 使用像APC这样的真正的缓存系统    - 停用EchoSqlLogger    - 关闭autoGenerateProxyClasses

      下一步

      要在CI中使用Doctrine,请从控制器中调用它,例如:

      应用/控制器/ my_controller.php:

      function doctrine_orm()
      {
          $this->load->library('Doctrine');
          $em = $this->doctrine->em;
      
          // do Doctrine stuff
          $productRepository = $em->getRepository('Product');
          $products = $productRepository->findAll();
          foreach ($products as $product):
              echo sprintf("-%s\n", $product->getName());
          endforeach;
      }
      

      然而,在执行任何Doctrine之前,您必须首先将数据库表映射到Doctrine&#34;实体&#34;。在这里了解如何:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/getting-started.html

答案 1 :(得分:1)

对于CI3 + HMVC + Doctrine 2.4

<?php

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\ClassLoader;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Event\Listeners\MysqlSessionInit;
use Doctrine\DBAL\Logging\EchoSQLLogger;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\ORM\Tools\SchemaTool;
use Gedmo\Sluggable\SluggableListener;
use Gedmo\Timestampable\TimestampableListener;
use Gedmo\Tree\TreeListener;

class Doctrine
{

    public $em = null;
    public $tool = null;

    public function __construct()
    {

        // Is the config file in the environment folder?
        if (!defined('ENVKRONMENT') OR !file_exists($file_path = APPPATH . 'config/' . ENVIRONMENT . '/database.php')) {
            $file_path = APPPATH . 'config/database.php';
        }
        // load database configuration from CodeIgniter
        require $file_path;


        // Set up class loading. You could use different autoloaders, provided by your favorite framework,
        // if you want to.
        require_once APPPATH . 'vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php';

        $doctrineClassLoader = new ClassLoader('Doctrine', APPPATH . 'libraries');
        $doctrineClassLoader->register();
        $entitiesClassLoader = new ClassLoader('models', rtrim(APPPATH, "/"));
        $entitiesClassLoader->register();
        $proxiesClassLoader = new ClassLoader('Proxies', APPPATH . 'proxies');
        $proxiesClassLoader->register();


        foreach (glob(APPPATH . 'modules/*', GLOB_ONLYDIR) as $m) {
            $module = str_replace(APPPATH . 'modules/', '', $m);
            $loader = new ClassLoader($module, APPPATH . 'modules');
            $loader->register();
        }


        $evm = new EventManager;
        // timestampable
        $evm->addEventSubscriber(new TimestampableListener);
        // sluggable
        $evm->addEventSubscriber(new SluggableListener);
        // tree
        $evm->addEventSubscriber(new TreeListener);


        // Set up caches
        $config = new Configuration;
        $cache = new ArrayCache;
        $config->setMetadataCacheImpl($cache);
        $driverImpl = $config->newDefaultAnnotationDriver(array(APPPATH . 'models/Entities'));
        $config->setMetadataDriverImpl($driverImpl);
        $config->setQueryCacheImpl($cache);

        $config->setQueryCacheImpl($cache);

        // Proxy configuration
        $config->setProxyDir(APPPATH . '/proxies'); //must be set to 777
        $config->setProxyNamespace('Proxies');

        // Set up logger
        $logger = new EchoSQLLogger;
        $config->setSQLLogger($logger);


        if (ENVIRONMENT == "development") {
            $config->setAutoGenerateProxyClasses(true);
        } else {
            $config->setAutoGenerateProxyClasses(false);
        }


        // Database connection information
        $connectionOptions = array(
            'driver' => 'pdo_mysql',
            'user' => $db[$active_group]['username'],
            'password' => $db[$active_group]['password'],
            'host' => $db[$active_group]['hostname'],
            'dbname' => $db[$active_group]['database']
        );

        // Create EntityManager
        $this->em = EntityManager::create($connectionOptions, $config);


        // Force UTF-8
        $this->em->getEventManager()->addEventSubscriber(new MysqlSessionInit('utf8', 'utf8_unicode_ci'));

        // Schema Tool
        $this->tool = new SchemaTool($this->em);

    }
}