Ошибки при интеграции Doctrine в Zend Framework

#php #doctrine #doctrine-orm

#php #доктрина #doctrine-orm

Вопрос:

При попытке запустить простую команду $ msg = $this->_em-> find(«Entities Message», 1); в моем IndexController я получаю следующие ошибки:

 ( ! ) Warning: class_parents() [function.class-parents]: Class EntitiesMessage does not exist and could not be loaded in C:wampwwwKosherOvenlibraryDoctrineORMMappingClassMetadataFactory.php on line 222
Call Stack
#   Time    Memory  Function    Location
1   0.0006  372272  {main}( )   ..index.php:0
2   0.0918  5254808 Zend_Application->run( )    ..index.php:27
3   0.0918  5254808 Zend_Application_Bootstrap_Bootstrap->run( )    ..Application.php:366
4   0.0919  5254864 Zend_Controller_Front->dispatch( )  ..Bootstrap.php:97
5   0.1088  6406328 Zend_Controller_Dispatcher_Standard->dispatch( )    ..Front.php:954
6   0.1218  6758576 Zend_Controller_Action->dispatch( ) ..Standard.php:295
7   0.1219  6761896 IndexController->indexAction( ) ..Action.php:513
8   0.1219  6761992 DoctrineORMEntityManager->find( ) ..IndexController.php:16
9   0.1225  6764176 DoctrineORMEntityManager->getRepository( )    ..EntityManager.php:344
10  0.1225  6764240 DoctrineORMEntityManager->getClassMetadata( ) ..EntityManager.php:567
11  0.1225  6764240 DoctrineORMMappingClassMetadataFactory->getMetadataFor( )    ..EntityManager.php:251
12  0.1226  6764272 DoctrineORMMappingClassMetadataFactory->loadMetadata( )  ..ClassMetadataFactory.php:169
13  0.1226  6764456 DoctrineORMMappingClassMetadataFactory->getParentClasses( )  ..ClassMetadataFactory.php:245
14  0.1226  6764608 class_parents ( )   ..ClassMetadataFactory.php:222

( ! ) Warning: array_reverse() expects parameter 1 to be array, boolean given in C:wampwwwKosherOvenlibraryDoctrineORMMappingClassMetadataFactory.php on line 222
Call Stack
#   Time    Memory  Function    Location
1   0.0006  372272  {main}( )   ..index.php:0
2   0.0918  5254808 Zend_Application->run( )    ..index.php:27
3   0.0918  5254808 Zend_Application_Bootstrap_Bootstrap->run( )    ..Application.php:366
4   0.0919  5254864 Zend_Controller_Front->dispatch( )  ..Bootstrap.php:97
5   0.1088  6406328 Zend_Controller_Dispatcher_Standard->dispatch( )    ..Front.php:954
6   0.1218  6758576 Zend_Controller_Action->dispatch( ) ..Standard.php:295
7   0.1219  6761896 IndexController->indexAction( ) ..Action.php:513
8   0.1219  6761992 DoctrineORMEntityManager->find( ) ..IndexController.php:16
9   0.1225  6764176 DoctrineORMEntityManager->getRepository( )    ..EntityManager.php:344
10  0.1225  6764240 DoctrineORMEntityManager->getClassMetadata( ) ..EntityManager.php:567
11  0.1225  6764240 DoctrineORMMappingClassMetadataFactory->getMetadataFor( )    ..EntityManager.php:251
12  0.1226  6764272 DoctrineORMMappingClassMetadataFactory->loadMetadata( )  ..ClassMetadataFactory.php:169
13  0.1226  6764456 DoctrineORMMappingClassMetadataFactory->getParentClasses( )  ..ClassMetadataFactory.php:245
14  0.1247  6774560 array_reverse ( )   ..ClassMetadataFactory.php:222

( ! ) Warning: Invalid argument supplied for foreach() in C:wampwwwKosherOvenlibraryDoctrineORMMappingClassMetadataFactory.php on line 222
Call Stack
#   Time    Memory  Function    Location
1   0.0006  372272  {main}( )   ..index.php:0
2   0.0918  5254808 Zend_Application->run( )    ..index.php:27
3   0.0918  5254808 Zend_Application_Bootstrap_Bootstrap->run( )    ..Application.php:366
4   0.0919  5254864 Zend_Controller_Front->dispatch( )  ..Bootstrap.php:97
5   0.1088  6406328 Zend_Controller_Dispatcher_Standard->dispatch( )    ..Front.php:954
6   0.1218  6758576 Zend_Controller_Action->dispatch( ) ..Standard.php:295
7   0.1219  6761896 IndexController->indexAction( ) ..Action.php:513
8   0.1219  6761992 DoctrineORMEntityManager->find( ) ..IndexController.php:16
9   0.1225  6764176 DoctrineORMEntityManager->getRepository( )    ..EntityManager.php:344
10  0.1225  6764240 DoctrineORMEntityManager->getClassMetadata( ) ..EntityManager.php:567
11  0.1225  6764240 DoctrineORMMappingClassMetadataFactory->getMetadataFor( )    ..EntityManager.php:251
12  0.1226  6764272 DoctrineORMMappingClassMetadataFactory->loadMetadata( )  ..ClassMetadataFactory.php:169
13  0.1226  6764456 DoctrineORMMappingClassMetadataFactory->getParentClasses( )  ..ClassMetadataFactory.php:245

( ! ) Fatal error: Cannot redeclare class Message in C:wampwwwKosherOvenapplicationmodelsEntitiesMessage.php on line 9
Call Stack
#   Time    Memory  Function    Location
1   0.0006  372272  {main}( )   ..index.php:0
2   0.0918  5254808 Zend_Application->run( )    ..index.php:27
3   0.0918  5254808 Zend_Application_Bootstrap_Bootstrap->run( )    ..Application.php:366
4   0.0919  5254864 Zend_Controller_Front->dispatch( )  ..Bootstrap.php:97
5   0.1088  6406328 Zend_Controller_Dispatcher_Standard->dispatch( )    ..Front.php:954
6   0.1218  6758576 Zend_Controller_Action->dispatch( ) ..Standard.php:295
7   0.1219  6761896 IndexController->indexAction( ) ..Action.php:513
8   0.1219  6761992 DoctrineORMEntityManager->find( ) ..IndexController.php:16
9   0.1225  6764176 DoctrineORMEntityManager->getRepository( )    ..EntityManager.php:344
10  0.1225  6764240 DoctrineORMEntityManager->getClassMetadata( ) ..EntityManager.php:567
11  0.1225  6764240 DoctrineORMMappingClassMetadataFactory->getMetadataFor( )    ..EntityManager.php:251
12  0.1226  6764272 DoctrineORMMappingClassMetadataFactory->loadMetadata( )  ..ClassMetadataFactory.php:169
13  0.1257  6774344 DoctrineORMMappingClassMetadataFactory->newClassMetadataInstance( )  ..ClassMetadataFactory.php:260
14  0.1301  7172352 DoctrineORMMappingClassMetadata->__construct( )  ..ClassMetadataFactory.php:351
15  0.1301  7172592 ReflectionClass->__construct( ) ..ClassMetadata.php:67
16  0.1302  7172896 DoctrineCommonClassLoader->loadClass( )   ..ClassLoader.php:0
17  0.1305  7182920 require( 'C:wampwwwKosherOvenapplicationmodelsEntitiesMessage.php' ) ..ClassLoader.php:148
  

Вот мой загрузочный код doctrine:

 protected function _initDoctrine()
{
    /* Autoload classes */
    require_once 'Doctrine/Common/ClassLoader.php';
    $classLoader = new DoctrineCommonClassLoader('Doctrine');
    $classLoader->register();
    // load the doctrine class loader for Symfony library components
    $classLoader = new DoctrineCommonClassLoader('Symfony', 'Doctrine');
    $classLoader->register();
    $classLoader = new DoctrineCommonClassLoader('Entities', APPLICATION_PATH . '/models');
    $classLoader->register();

    /* Choose cache */

    if (APPLICATION_ENV == "development") {
        $cache = new DoctrineCommonCacheArrayCache;
    } else {
        //$cache = new DoctrineCommonCacheApcCache;
        $cache = new DoctrineCommonCacheArrayCache;
    }

    $config = new DoctrineORMConfiguration;
    $config->setMetadataCacheImpl($cache);

    $driverImpl = $config->newDefaultAnnotationDriver(APPLICATION_PATH . '/configs/doctrine/Mapping');
    $config->setMetadataDriverImpl($driverImpl);
    $config->setQueryCacheImpl($cache);
    $config->setProxyDir(APPLICATION_PATH . '/Proxies');
    $config->setProxyNamespace('Proxies');

    if (APPLICATION_ENV == "development") {
        $config->setAutoGenerateProxyClasses(true);
    } else {
        $config->setAutoGenerateProxyClasses(false);
    }

    $configObj = $this->_initConfig();

    $connectionOptions = array(
        'driver'   => $configObj->database->adapter,
        'dbname'   => $configObj->database->params->dbname,
        'host'     => $configObj->database->params->host,
        'user'     => $configObj->database->params->username,
        'password' => $configObj->database->params->password
    );
    $em = DoctrineORMEntityManager::create($connectionOptions, $config);

    Zend_Registry::set('em', $em);
}
  

Я использую Doctrine 2.0.4.

Я не могу придумать никакой другой информации, которую можно было бы предоставить, но я был бы рад добавить больше информации, если это необходимо.

Ответ №1:

Убедитесь, что у вас есть следующий класс в application/models/Entities/Message.php

 namespace Entities;

/**
 * @Entity
 */
class Message
{
    // ...
  

Кроме того, я не уверен насчет этой строки

 // load the doctrine class loader for Symfony library components
$classLoader = new DoctrineCommonClassLoader('Symfony', 'Doctrine');
  

Разве это не говорит о том, что Symfony пространство имен / папка находится в Doctrine каталоге?

Редактировать: Я предполагаю, что это должно выглядеть следующим образом

 $classLoader = new DoctrineCommonClassLoader('Symfony');
  

Обновить

Кажется, я вижу, чего не хватает. Вы не указываете драйверу аннотаций, где искать ваши объекты.

Я думаю, что эта строка

$driverImpl = $config->newDefaultAnnotationDriver(APPLICATION_PATH . ‘/configs/doctrine/Mapping’);

должно быть

 $driverImpl = $config->newDefaultAnnotationDriver(APPLICATION_PATH . '/models/Entities');
  

Смотрите http://www.doctrine-project.org/docs/orm/2.0/en/reference/configuration.html

Я настоятельно рекомендую вам ознакомиться с интеграцией Bisna от Гильерме Бланко — https://github.com/guilhermeblanco/ZendFramework1-Doctrine2

У меня также есть своего рода скелет приложения ZF / Doctrine2, на который вы можете посмотреть — https://github.com/philBrown/ZFDoctrineSkeleton

Комментарии:

1. Вы имеете в виду ‘application/models/Entities/Message.php ‘ должен содержать код, сгенерированный Doctrine? Если да, то это так. И я думаю, что вторая вещь необходима для компонентов Symfony, используемых в инструменте cli.

2. @moteutsch Нет, сгенерированный код (прокси) загружается application/Proxies , и вам не нужно беспокоиться о них. Поскольку вы используете драйвер аннотаций, вам необходимо создать реальные классы для ваших сущностей.

3. Если вы хотите, чтобы ваши объекты находились прямо в models/ папке, тогда вам придется использовать автозагрузчик ресурсов Zend.

4. @Cobby Нет, это не так. Они настроили загрузчик классов Doctrine на поиск Entities классов с пространством имен в applications/models/Entities

Ответ №2:

Похоже, вы не загружаете свои загрузчики классов Doctrine, Symfony и Entities в автозагрузчик Zend:

 require_once 'Doctrine/Common/ClassLoader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();

$symfonyAutoloader = new DoctrineCommonClassLoader('Symfony');
$autoloader->pushAutoloader(array($symfonyAutoloader, 'loadClass'), 'Symfony');

$doctrineAutoloader = new DoctrineCommonClassLoader('Doctrine');
$autoloader->pushAutoloader(array($doctrineAutoloader, 'loadClass'), 'Doctrine');

$entityAutoloader = new DoctrineCommonClassLoader('Entities', APPLICATION_PATH . '/models');
$autoloader->pushAutoloader(array($entityAutoloader, 'loadClass'), 'Entities');
  

Комментарии:

1. Вместо этого он их регистрирует. PHP может обрабатывать несколько автозагрузчиков.