Integrating Doctrine with CodeIgniter Integrating Doctrine with CodeIgniter codeigniter codeigniter

Integrating Doctrine with CodeIgniter


Downloading the Doctrine ORM straight from GitHub doesn't include the other dependencies. These are managed by Composer. If you look inside the composer.json file you can see these dependencies. If you want to install them manually, they are:

  • doctrine/common
  • doctrine/inflector
  • doctrine/cache
  • doctrine/collections
  • doctrine/lexer
  • doctrine/annotations
  • doctrine/dbal
  • symfony/console

I believe that's all of them. You will have to merge these files in their appropriate directories as they follow PSR-0 standards for the autoloading of classes.

Alternatively, install Doctrine 2 with Composer with the following composer.json file and any other dependencies will be installed automatically. Then integrate with CodeIgniter.

{    "minimum-stability": "stable",    "require": {        "doctrine/orm": "2.3.*"    }}

Edit the index.php file of your CodeIgniter app by adding a single line to include the autoloader file before requiring the CodeIgniter core.

require_once BASEPATH.'../vendor/autoload.php';require_once BASEPATH.'core/CodeIgniter.php';

Also if installing with Composer, use this edited version of the bootstrap as the contents of application/libraries/Doctrine.php, which is what worked for me

<?phpuse Doctrine\Common\ClassLoader,    Doctrine\ORM\Tools\Setup,    Doctrine\ORM\EntityManager;class Doctrine{    public $em;    public function __construct()    {        // Load the database configuration from CodeIgniter        require APPPATH . 'config/database.php';        $connection_options = array(            'driver'        => 'pdo_mysql',            'user'          => $db['default']['username'],            'password'      => $db['default']['password'],            'host'          => $db['default']['hostname'],            'dbname'        => $db['default']['database'],            'charset'       => $db['default']['char_set'],            'driverOptions' => array(                'charset'   => $db['default']['char_set'],            ),        );        // With this configuration, your model files need to be in application/models/Entity        // e.g. Creating a new Entity\User loads the class from application/models/Entity/User.php        $models_namespace = 'Entity';        $models_path = APPPATH . 'models';        $proxies_dir = APPPATH . 'models/Proxies';        $metadata_paths = array(APPPATH . 'models');        // Set $dev_mode to TRUE to disable caching while you develop        $config = Setup::createAnnotationMetadataConfiguration($metadata_paths, $dev_mode = true, $proxies_dir);        $this->em = EntityManager::create($connection_options, $config);        $loader = new ClassLoader($models_namespace, $models_path);        $loader->register();    }}

Note: Version 3 of CodeIgniter when released, will be installable with Composer, but version 2 is not.


For those looking for a tutorial to integrate Doctrine 2 with CodeIgniter, this question and others answers are outdated (for CI 2).This is a new tutorial for CI 3 I made and I checked is working:

How to install Doctrine 2 in CodeIgniter 3


I repeat it here.

Install Doctrine

Doctrine 2 ORM’s documentation - Installation and Configuration

Doctrine can be installed with Composer.Define the following requirement in your composer.json file:

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

Then call composer install from your command line.

Integrating with CodeIgniter

Doctrine 2 ORM’s documentation - Integrating with CodeIgniter

Here are the steps:Add a php file to your system/application/libraries folder called Doctrine.php. This is going to be your wrapper/bootstrap for the D2 entity manager.Put the Doctrine folder (the one that contains Common, DBAL, and ORM) inside the third_party folder.If you want, open your config/autoload.php file and autoload your Doctrine library: $autoload[‘libraries’] = array(‘doctrine’);

Creating your Doctrine CodeIgniter library

Now, here is what your Doctrine.php file should look like. Customize it to your needs.

<?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';    // include Doctrine's ClassLoader class    require_once APPPATH.'third_party/Doctrine/Common/ClassLoader.php';    // load the Doctrine classes            $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;      $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    $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);  }}

Setting up the Command Line Tool

Doctrine ships with a number of command line tools that are very helpful during development.

Check if these lines exists in the Doctrine.php file, to load Symfony classes for using the Command line tools (and for YAML mapping files):

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

You need to register your applications EntityManager to the console tool to make use of the tasks by creating a cli-doctrine.php file in the application directory with the following content:

 <?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); ?>

Now run this script through the PHP command-line and should see a list of commands available to you.

php cli-doctrine.php

Generate mapping classes from database:

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

if you get this error: Fatal error: Call to undefined function Doctrine\Common\Cache\apc_fetch()install the APC extension for PHP:

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

For production mode you'll want to use a real caching system like APC, get rid of EchoSqlLogger, and turn off autoGenerateProxyClasses in Doctrine.php