我已经成功安装了最新版本的CodeIgniter,并且基本的MVC模式正常运行。我注意到的问题是CI在查询时自然不允许准备好的语句。所以,我决定从GitHub下载Doctrine 1。我对Doctrine很新,需要一些帮助将它与CI集成,所以我遵循了tutorial。
在我的一个控制器中,我有
$this->load->library('doctrine');
$this->em = $this->doctrine->em;
但是,当我在浏览器中加载视图时,我遇到了错误的阅读
消息:require_once(/Applications/MAMP/htdocs/CodeIgniter/application/libraries/Doctrine/Common/ClassLoader.php):无法打开流:没有这样的文件或目录
在从GitHub进一步检查Doctrine下载后,似乎甚至没有任何标题为“common”的文件夹。我对CI很新,尤其是学说。有没有人有一些建议可以帮我搞定这个?此外,是否可以使用MySQLi驱动程序而不是使用Doctrine的PDO驱动程序?
答案 0 :(得分:12)
直接从GitHub下载Doctrine ORM不包含其他依赖项。这些由Composer管理。如果查看composer.json文件,可以看到这些依赖项。如果您想手动安装它们,它们是:
我相信这一切都是他们。您必须将这些文件合并到适当的目录中,因为它们遵循PSR-0 standards进行类的自动加载。
或者,使用Composer安装带有以下composer.json文件的Doctrine 2,并自动安装任何其他依赖项。然后是integrate with CodeIgniter。
{
"minimum-stability": "stable",
"require": {
"doctrine/orm": "2.3.*"
}
}
在需要CodeIgniter核心之前,通过添加一行来包含自动加载器文件来编辑CodeIgniter应用程序的index.php
文件。
require_once BASEPATH.'../vendor/autoload.php';
require_once BASEPATH.'core/CodeIgniter.php';
另外,如果使用Composer进行安装,请使用此编辑版本的bootstrap作为application/libraries/Doctrine.php
的内容,这对我有用
<?php
use 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();
}
}
注意:CodeIgniter的第3版在发布时,可以使用Composer进行安装,但不能安装第2版。
答案 1 :(得分:2)
对于那些寻找将Doctrine 2与CodeIgniter集成的教程的人来说,这个问题和其他答案已经过时(对于CI 2)。 这是我制作的CI 3的新教程,我检查过的是:
How to install Doctrine 2 in CodeIgniter 3
我在这里重复一遍。
安装条款
Doctrine 2 ORM’s documentation - Installation and Configuration
可以使用Composer安装Doctrine。 在composer.json文件中定义以下要求:
{
"require": {
"doctrine/orm": "*"
}
}
然后从命令行调用composer install。
与CodeIgniter集成
Doctrine 2 ORM’s documentation - Integrating with CodeIgniter
以下是步骤:
将php文件添加到名为Doctrine.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();
您需要将应用程序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
对于生产模式,您需要使用像APC这样的真实缓存系统,摆脱EchoSqlLogger
,并关闭Doctrine.php中的autoGenerateProxyClasses
答案 2 :(得分:1)
答案 3 :(得分:0)
请注意代码点火器2 在代码组织方面略有不同。在代码点火器2 中,最好将Doctrine
文件夹放在application/third_party
文件夹中,而不是application/libraries
文件夹中(否则它将无效!)。
您可以阅读更多相关信息here
答案 4 :(得分:0)
当我尝试从doctrine用户指南中学习本教程时,我遇到了同样的问题 http://doctrine-orm.readthedocs.org/en/latest/cookbook/integrating-with-codeigniter.html
当我尝试通过composer安装时会出现此问题,因此我访问了此网站 http://www.doctrine-project.org/downloads/并手动下载DoctrineORM-2.3.3-full.tar.gz版本,错误消失了。
答案 5 :(得分:0)
原始海报的问题似乎是自动加载的问题。尝试使用Composer设置CodeIgniter和Doctrine时,我遇到了类似的问题。在CodeIgniter 3中,您可以启用composer autoloading,这应该允许您正确加载所有Doctrine文件。您必须将Composer供应商目录指向应用程序/供应商才能使其正常工作。您也可以在旧版本中执行此操作,但是您必须在CodeIgniter的Doctrine库文件中手动包含Composer自动加载文件。 如果您想了解更多信息:我写了一篇博文,详细描述了如何做到这一点。 http://blog.beheist.com/integrating-codeigniter-and-doctrine-2-orm-with-composer/
答案 6 :(得分:0)
你可以用这个
通过作曲家: composer create-project rbz / codeigniter your-project
通过git: git clone https://github.com/dandisy/cihmvctwig.git