2013-06-15 2 views
6

Я успешно установил последнюю версию CodeIgniter и имею базовый шаблон MVC. Проблема, которую я заметил, заключается в том, что CI, естественно, не позволяет готовить заявления, когда дело доходит до запросов. Итак, я решил скачать Doctrine 1 от GitHub. Я очень новичок в Doctrine и нуждаюсь в некоторой помощи, интегрируя его с CI, поэтому я следил за этим tutorial.Интеграция доктрины с CodeIgniter

В одном из моих контроллеров, у меня есть

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

Но, когда я иду, чтобы загрузить представление в моем браузере, я поздоровался с ошибкой чтения

Message: require_once(/Applications/MAMP/htdocs/CodeIgniter/application/libraries/Doctrine/Common/ClassLoader.php): failed to open stream: No such file or directory

При дальнейшем осмотре из Doctrine download из GitHub, там даже нет папки под названием «common» в любом месте. Я очень новичок в CI и особенно в доктрине. Есть ли у кого-нибудь советы, которые могут помочь мне заставить это работать? Кроме того, можно ли использовать драйвер MySQLi вместо PDO с Doctrine?

ответ

12

Загрузка доктрины ORM прямо из GitHub не включает другие зависимости. Они управляются Composer. Если вы заглянете в файл composer.json, вы увидите эти зависимости. Если вы хотите установить их вручную, они являются:

  • доктрины/общей
  • учения/инфлектором
  • доктрины/кэшем
  • доктрины/коллекциями
  • учения/лексер
  • доктриной/аннотация
  • доктрина/dbal
  • symfony/console

Я считаю, что это все. Вам придется объединить эти файлы в соответствующие каталоги, поскольку они следуют за PSR-0 standards для автозагрузки классов.

В качестве альтернативы, установите Doctrine 2 с Composer со следующим файлом composer.json, и любые другие зависимости будут установлены автоматически. Затем integrate with CodeIgniter.

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

Редактировать index.php файл вашего приложения CodeIgniter, добавив одну строку, чтобы включить файл автозагрузчика, прежде чем потребуется ядро ​​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(); 
    } 
} 

Примечание: Версия 3 из CodeIgniter, когда выпустили, будет устанавливается с помощью Composer, но версия 2 - нет.

+0

к сожалению, я сделал ошибку в моем первоначальном ответе. Я видел композитора.json в мастер-ветке, но не проверял, было ли это в 2.1-стабильной ветке. Я исправил это сейчас. –

+0

Я все еще не совсем уверен, что делать с композитором. В доктрине есть файл json, но все. – Lance

0

Обратите внимание: код воспламенителя 2 имеет небольшую разницу в организации кода.В код воспламенителя 2 лучше разместить папку Doctrine в папке application/third_party, а не в папку application/libraries (иначе это не сработает!).

Вы можете прочитать больше об этом here

0

Я была такая же проблема, когда я пытался следовать этому учебнику от доктрины руководства пользователя http://doctrine-orm.readthedocs.org/en/latest/cookbook/integrating-with-codeigniter.html

Этой проблема возникает, когда я попытался установить с помощью композитора так, то я перешли на этот сайт http://www.doctrine-project.org/downloads/ и вручную загрузили версию DoctrineORM-2.3.3-full.tar.gz, и ошибка исчезла.

0

Проблема с оригинальным постером, похоже, связана с автозагрузкой. Мне была предоставлена ​​аналогичная проблема при попытке настроить CodeIgniter и Doctrine с Composer. В CodeIgniter 3 вы можете включить использование автозагрузки композитора, что должно позволить вам правильно загрузить все файлы Doctrine. Чтобы это работало, укажите поставщик поставщика Composer для приложения/поставщика. Вы также можете сделать это в более старых версиях, но затем вы должны включить файл автозагрузки Composer вручную в свой файл библиотеки Doctrine для CodeIgniter. Если вы хотите получить дополнительную информацию: я написал сообщение в блоге с описанием того, как это сделать. http://blog.beheist.com/integrating-codeigniter-and-doctrine-2-orm-with-composer/

+0

Не могли бы вы добавить здесь некоторые части своего блога? – abarisone

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. Определить следующее требование в файле composer.json:

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

Затем вызовите композитор установки из командной строки.

Интеграция с CodeIgniter

Doctrine 2 ORM’s documentation - Integrating with CodeIgniter

Вот шаги: Добавить файл PHP в вашей системе/приложения/библиотеки папку под названием Doctrine.php. Это будет ваша обертка/бутстрап для менеджера сущности D2. Поместите папку Doctrine (ту, которая содержит Common, DBAL и ORM) внутри папки third_party. Если вы хотите, откройте свою конфигурацию/автозагрузку.PHP файл и автозагрузку ваша Доктрина библиотека: $autoload[‘libraries’] = array(‘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); 
    } 
} 

Настройка Line Tool Command

Учение судов с рядом инструментов командной строки, которые очень полезны в процессе разработки.

Проверьте эти строки существует в файле Doctrine.php, загружать классы Symfony для использования инструментов командной строки (и для отображения файлов YAML):

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

Вы должны зарегистрировать приложения EntityManager к консольный инструмент для использования задач путем создания файла кли-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() установить расширение APC для PHP:

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

для режима производства вы хотите использовать систему реального кэширования, как APC, избавиться от EchoSqlLogger, и выключить autoGenerateProxyClasses в Doctrine.php

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+1

Я следовал советам –

+0

Копирование и вставка содержимого –

0

вы можете использовать этот

через композитор: композитора создать-проект RBZ/CodeIgniter ваш-проект

через мерзавец: мерзавец клон https://github.com/dandisy/cihmvctwig.git

Смежные вопросы