The annotations "@Doctrine \ ORM \ Mapping \ Entity" in the class Entities \ USER_User does not exist or cannot be loaded automatically

I would like to use Doctrine 2 in combination with "l3pp4rd / DoctrineExtensions" in my Zend Framework application. But I get the following error message:

The annotation "@Doctrine \ ORM \ Mapping \ Entity" in the Entities \ USER_User class does not exist or cannot be loaded automatically.

Application \ bootstrap.php

protected function _initDoctrine() { require_once('Doctrine/Common/ClassLoader.php'); $autoloader = Zend_Loader_Autoloader::getInstance(); $classLoader = array(new \Doctrine\Common\ClassLoader('Doctrine'), 'loadClass'); $autoloader->pushAutoloader($classLoader, 'Doctrine\\'); $classLoader = new \Doctrine\Common\ClassLoader('Entities', realpath(Zend_Registry::get('config')->resources->entityManager->connection->entities), 'loadClass'); $autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Entities'); $classLoader = new \Doctrine\Common\ClassLoader('Repositories', realpath(Zend_Registry::get('config')->resources->entityManager->connection->entities), 'loadClass'); $autoloader->pushAutoloader(array($classLoader, 'loadClass'), 'Repositories'); } 

library \ My \ Resource \ Entitymanager.php found at http://www.gediminasm.org/article/annotation-reference

 class My_Resource_Entitymanager extends Zend_Application_Resource_ResourceAbstract { public function init() { // WARNING: setup, assumes that autoloaders are set // configuration settings from the application.ini file $zendConfig = new Zend_Config($this->getOptions()); // globally used cache driver, in production use APC or memcached $cache = new Doctrine\Common\Cache\ArrayCache; // standard annotation reader $annotationReader = new Doctrine\Common\Annotations\AnnotationReader; $cachedAnnotationReader = new Doctrine\Common\Annotations\CachedReader( $annotationReader, // use reader $cache // and a cache driver ); // create a driver chain for metadata reading $driverChain = new Doctrine\ORM\Mapping\Driver\DriverChain(); // load superclass metadata mapping only, into driver chain // also registers Gedmo annotations.NOTE: you can personalize it Gedmo\DoctrineExtensions::registerAbstractMappingIntoDriverChainORM( $driverChain, // our metadata driver chain, to hook into $cachedAnnotationReader // our cached annotation reader ); // now we want to register our application entities, // for that we need another metadata driver used for Entity namespace $annotationDriver = new Doctrine\ORM\Mapping\Driver\AnnotationDriver( $cachedAnnotationReader, // our cached annotation reader $zendConfig->connection->entities // paths to look in ); // NOTE: driver for application Entity can be different, Yaml, Xml or whatever // register annotation driver for our application Entity namespace $driverChain->addDriver($annotationDriver, 'Entities'); // general ORM configuration $config = new Doctrine\ORM\Configuration; $config->setProxyDir($zendConfig->connection->proxies->location); $config->setProxyNamespace($zendConfig->connection->proxies->ns); $config->setAutoGenerateProxyClasses($zendConfig->connection->proxies->generate); // this can be based on production config. // register metadata driver $config->setMetadataDriverImpl($driverChain); // use our allready initialized cache driver $config->setMetadataCacheImpl($cache); $config->setQueryCacheImpl($cache); // create event manager and hook prefered extension listeners $evm = new Doctrine\Common\EventManager(); // gedmo extension listeners, remove which are not used // sluggable $sluggableListener = new Gedmo\Sluggable\SluggableListener; // you should set the used annotation reader to listener, to avoid creating new one for mapping drivers $sluggableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($sluggableListener); // tree $treeListener = new Gedmo\Tree\TreeListener; $treeListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($treeListener); // loggable, not used in example $loggableListener = new Gedmo\Loggable\LoggableListener; $loggableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($loggableListener); // timestampable $timestampableListener = new Gedmo\Timestampable\TimestampableListener; $timestampableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($timestampableListener); // translatable $translatableListener = new Gedmo\Translatable\TranslatableListener; // current translation locale should be set from session or hook later into the listener // most important, before entity manager is flushed $translatableListener->setTranslatableLocale('en'); $translatableListener->setDefaultLocale('en'); $translatableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($translatableListener); // sortable, not used in example $sortableListener = new Gedmo\Sortable\SortableListener; $sortableListener->setAnnotationReader($cachedAnnotationReader); $evm->addEventSubscriber($sortableListener); // mysql set names UTF-8 if required $evm->addEventSubscriber(new Doctrine\DBAL\Event\Listeners\MysqlSessionInit()); // DBAL connection $connection = array( 'driver' => "{$zendConfig->connection->driver}", 'host' => "{$zendConfig->connection->host}", 'dbname' => "{$zendConfig->connection->dbname}", 'user' => "{$zendConfig->connection->user}", 'password' => "{$zendConfig->connection->password}" ); // Finally, create entity manager $em = Doctrine\ORM\EntityManager::create($connection, $config, $evm); Zend_Registry::set('em', $em); return $em; } } 

applications \ models \ USER_User.php

 namespace Entities; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\HasLifecycleCallbacks */ class USER_User { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * Retrieve user id */ public function getId() { return $this->id; } } 

Application \ configs \ application.ini

 ... includePaths.library = APPLICATION_PATH "/../library/Doctrine" ... pluginPaths.My_Resource = "My/Resource" ... autoloaderNamespaces[] = "Doctrine" autoloaderNamespaces[] = "Gedmo" autoloaderNamespaces[] = "Symfony" autoloaderNamespaces[] = "My" ... resources.entityManager.connection.driver = "pdo_mysql" resources.entityManager.connection.host = "localhost" resources.entityManager.connection.dbname = "test" resources.entityManager.connection.user = "test" resources.entityManager.connection.password = "test" resources.entityManager.connection.entities = APPLICATION_PATH "/models" resources.entityManager.connection.proxies.location = APPLICATION_PATH "/models/Proxies" resources.entityManager.connection.proxies.ns = "Proxies" ; According to Doctrine manual, this should be true for ; development, and false for production resources.entityManager.connection.proxies.generate = true ... 

Any ideas to make this work?

+5
source share
3 answers

Solved with the answer to this question: doctrig2 autloader with Kli should use AnnotationRegistry

added to library \ My \ Resource \ Entitymanager.php

 use Doctrine\Common\Annotations\AnnotationRegistry; class My_Resource_Entitymanager extends Zend_Application_Resource_ResourceAbstract { public function init() { AnnotationRegistry::registerFile(__DIR__ . '/../../Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php'); // WARNING: setup, assumes that autoloaders are set // configuration settings from the application.ini file ... 

I also deleted

 $classLoader = array(new \Doctrine\Common\ClassLoader('Doctrine'), 'loadClass'); $autoloader->pushAutoloader($classLoader, 'Doctrine\\'); 

from application \ bootstrap.php

Thanks for reading my question!

+6
source

I had the same problem with Zend Framework 2, and the solution is almost the same. Just make sure that you execute the above statement while installing the application. This can be easily done in the Module.php file:

 class Module { // ... /** * Event being executed on bootstrap */ public function onBootstrap(Event $e) { AnnotationRegistry::registerFile('path/to/ORM/Mapping/Driver/DoctrineAnnotations.php'); } } 
+2
source

The following snippet will use the existing autoloader configuration to find entity classes without requiring hard codes of any paths.

 use Doctrine\Common\Annotations\AnnotationRegistry; AnnotationRegistry::registerLoader('class_exists'); 

This is the method used by the doctrine module for Zend Framework 2 and has been in the Doctrine since at least version 2.1. It will work on everything that uses the annotation registry, including such as PHPCR-ODM.

Used in the doctrine module here:

https://github.com/doctrine/DoctrineModule/blob/1.1.0/src/DoctrineModule/Module.php#L54

+1
source

Source: https://habr.com/ru/post/913851/


All Articles