#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 может обрабатывать несколько автозагрузчиков.