对于那些正在寻找将 Doctrine 2 与 CodeIgniter 集成的教程的人,这个问题和其他答案已经过时(对于 CI 2)。这是我为 CI 3 制作的新教程,我检查了它是否有效:
如何在 CodeIgniter 3 中安装 Doctrine 2
我在这里重复一遍。
安装原则
Doctrine 2 ORM 的文档 - 安装和配置
可以使用Composer安装 Doctrine 。在您的 composer.json 文件中定义以下要求:
{
"require": {
"doctrine/orm": "*"
}
}
然后从命令行调用 composer install 。
与 CodeIgniter 集成
Doctrine 2 ORM 的文档 - 与 CodeIgniter 集成
以下是步骤: 将一个名为 Doctrine.php 的 php 文件添加到您的 system/application/libraries 文件夹中。这将成为 D2 实体管理器的包装器/引导程序。将 Doctrine 文件夹(包含 Common、DBAL 和 ORM 的文件夹)放在 third_party 文件夹中。如果你愿意,打开你的 config/autoload.php 文件并自动加载你的 Doctrine 库:$autoload[‘libraries’] = array(‘doctrine’);
创建 Doctrine CodeIgniter 库
现在,这就是您的 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';
// 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);
}
}
设置命令行工具
Doctrine 附带了许多在开发过程中非常有用的命令行工具。
检查 Doctrine.php 文件中是否存在这些行,以加载 Symfony 类以使用命令行工具(以及 YAML 映射文件):
$symfonyClassLoader = new ClassLoader('Symfony', APPPATH.'third_party/Doctrine');
$symfonyClassLoader->register();
您需要通过在应用程序目录中创建一个包含以下内容的 cli-doctrine.php 文件来将您的应用程序 EntityManager 注册到控制台工具以使用任务:
<?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
对于生产模式,您需要使用真正的缓存系统,如 APC,去掉并在 Doctrine.php 中EchoSqlLogger
关闭autoGenerateProxyClasses