6

我已经成功安装了最新版本的 CodeIgniter,并且基本的 MVC 模式正常工作。我注意到的问题是 CI 在查询时自然不允许使用准备好的语句。所以,我决定从GitHub下载 Doctrine 1 。我对 Doctrine 很陌生,需要一些帮助将其与 CI 集成,所以我按照本教程进行操作。

在我的一个控制器中,我有

$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 非常陌生,尤其是 Doctrine。有没有人有一些建议可以帮助我完成这项工作?另外,是否可以在 Doctrine 中使用 MySQLi 驱动程序而不是 PDO 驱动程序?

4

7 回答 7

12

直接从 GitHub 下载 Doctrine ORM 不包括其他依赖项。这些由Composer管理。如果您查看 composer.json 文件,您可以看到这些依赖项。如果要手动安装它们,它们是:

  • 学说/共同
  • 学说/变形
  • 学说/缓存
  • 教义/收藏
  • 学说/词法分析器
  • 学说/注释
  • 学说/dbal
  • symfony/控制台

我相信这就是他们的全部。您必须将这些文件合并到相应的目录中,因为它们遵循PSR-0 标准来自动加载类。

或者,使用 Composer 安装 Doctrine 2 并使用以下 composer.json 文件,任何其他依赖项都将自动安装。然后与 CodeIgniter 集成

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

编辑index.phpCodeIgniter 应用程序的文件,在需要 CodeIgniter 核心之前添加一行以包含自动加载器文件。

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

require_once BASEPATH.'core/CodeIgniter.php';

此外,如果使用 Composer 安装,请使用此编辑后的引导程序版本作为 的内容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 版不能。

于 2013-06-15T16:54:55.270 回答
2

对于那些正在寻找将 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

于 2015-10-31T22:56:40.583 回答
1

在 CI https://github.com/mitul69/codeigniter-doctrine-integration中找到学说集成的链接

于 2015-05-14T07:36:37.273 回答
0

原始海报的问题似乎是自动加载的问题。在尝试使用 Composer 设置 CodeIgniter 和 Doctrine 时,我遇到了类似的问题。在 CodeIgniter 3 中,您可以启用作曲家自动加载,这应该允许您正确加载所有 Doctrine 文件。您必须将 Composer 供应商目录指向 application/vendor 才能使其正常工作。您也可以在旧版本中执行此操作,但是您必须在 CodeIgniter 的 Doctrine 库文件中手动包含 Composer 自动加载文件。如果您想了解更多信息:我写了一篇博客文章,准确描述了如何做到这一点。http://blog.beheist.com/integrating-codeigniter-and-doctrine-2-orm-with-composer/

于 2015-04-30T17:06:34.833 回答
0

当我尝试从学说用户指南 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 版本和错误消失了。

于 2014-10-26T09:22:03.163 回答
0

请注意,代码点火器 2的代码组织略有不同。在代码点火器 2中,最好将Doctrine文件夹放在文件application/third_party夹中,而不是application/libraries文件夹中(否则它将不起作用!)。

你可以在这里阅读更多关于它的信息

于 2014-09-20T18:17:29.947 回答
0

你可以用这个

通过作曲家:composer create-project rbz/codeigniter your-project

通过 git:git clone https://github.com/dandisy/cihmvctwig.git

于 2016-02-10T04:02:18.933 回答