";未找到类“;当试图在zf2/学说下创建实体之间的继承时


"Class not found" when trying to create inheritance between entities under zf2 / doctrine

在Zend Framework 2下的一个项目中,我有一组带有Doctrine 2注释的实体。当我尝试使用生成模式时

php vendor/bin/doctrine orm:schema-tool:update --force

或者当我尝试使用生成getter/setter时

php vendor/bin/doctrine orm:generate-entities --update-entities="true" --generate-methods="true" module/Application/src

我总是得到这个错误:

PHP Fatal error:  Class 'Application'Model'Entity'Capteur' not found in /home/...MyApp/module/Application/src/Application/Model/Entity/CapteurResident.php on line 9

这里是完整的堆栈:

PHP Fatal error:  Class 'Application'Model'Entity'Capteur' not found in /home/...MyApp/module/Application/src/Application/Model/Entity/CapteurResident.php on line 9
PHP Stack trace:
PHP   1. {main}() /home/...MyApp/vendor/doctrine/orm/bin/doctrine:0
PHP   2. include() /home/...MyApp/vendor/doctrine/orm/bin/doctrine:4
PHP   3. Doctrine'ORM'Tools'Console'ConsoleRunner::run() /home/...MyApp/vendor/doctrine/orm/bin/doctrine.php:59
PHP   4. Symfony'Component'Console'Application->run() /home/...MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/Console/ConsoleRunner.php:64
PHP   5. Symfony'Component'Console'Application->doRun() /home/...MyApp/vendor/symfony/console/Symfony/Component/Console/Application.php:126
PHP   6. Symfony'Component'Console'Application->doRunCommand() /home/...MyApp/vendor/symfony/console/Symfony/Component/Console/Application.php:195
PHP   7. Symfony'Component'Console'Command'Command->run() /home/...MyApp/vendor/symfony/console/Symfony/Component/Console/Application.php:874
PHP   8. Doctrine'ORM'Tools'Console'Command'SchemaTool'AbstractCommand->execute() /home/...MyApp/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:257
PHP   9. Doctrine'Common'Persistence'Mapping'AbstractClassMetadataFactory->getAllMetadata() /home/...MyApp/vendor/doctrine/orm/lib/Doctrine/ORM/Tools/Console/Command/SchemaTool/AbstractCommand.php:59
PHP  10. Doctrine'Common'Persistence'Mapping'Driver'AnnotationDriver->getAllClassNames() /home/...MyApp/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:113
PHP  11. require_once() /home/...MyApp/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php:237

CapterResident和CapterEmbarque是以完全相同的方式扩展Capteur的两个实体。

<?php
namespace Application'Model'Entity;
use Doctrine'ORM'Mapping AS ORM;
/**
 * @ORM'Entity
 */
class CapteurResident extends 'Application'Model'Entity'Capteur
{
/**
 * @ORM'Entity
 */
class CapteurEmbarque extends 'Application'Model'Entity'Capteur
{

如果我删除实体"CapteurResident",一切都很好!

Entity classes generated to "/home/...MyApp/module/Application/src".

但不是在开发服务器上:在这个服务器上,我在另一个继承关系上有错误。。。尽管除了数据库参数之外,一切都是一样的。我真的不明白为什么这个错误在一台机器和另一台机器上发生得不同,为什么有些继承有效,而另一些则无效。

PHP Fatal error:  Class 'Application'Model'Entity'Mesure' not found in /home/.../module/Application/src/Application/Model/Entity/MesureCapteurEmbarque.php on line 9

这里的船长类:

<?php
namespace Application'Model'Entity;
use Doctrine'ORM'Mapping AS ORM;
/**
 * @ORM'Entity
 * @ORM'InheritanceType("SINGLE_TABLE")
 */
class Capteur
{
    /**
     * @ORM'Id
     * @ORM'Column(type="integer")
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;

cli-config.php:

<?php
use Doctrine'ORM'Tools'Console'ConsoleRunner;
require_once 'bootstrap.php';
$entityManager =GetEntityManager ();
return ConsoleRunner::createHelperSet ( $entityManager );

bootstrap.php(除了添加mysql枚举之外,我没有做任何特别的事情):

<?php
require_once "vendor/autoload.php";
use Doctrine'ORM'Tools'Setup;
use Doctrine'ORM'EntityManager;
function GetEntityManager() {
    $paths = array (
            'module/Application/src' 
    );
    $isDevMode = true;
    // the connection configuration
    $localConfig = include __DIR__ . '/autoload/local.php';
    $dbParams = $localConfig ['doctrine'] ['connection'] ['orm_default'] ['params'];
    $config = Setup::createAnnotationMetadataConfiguration ( $paths, $isDevMode, "data/proxies", null, false );
    $entityManager = EntityManager::create ( $dbParams, $config );
    $platform = $entityManager->getConnection ()->getDatabasePlatform ();
    $platform->registerDoctrineTypeMapping ( 'enum', 'string' );
    return $entityManager;
}

谢谢。我终于找到了一个解决方案:强制Zend自动加载器的行为。但我仍然觉得必须这么做很奇怪。

我在bootstrap.hp:的开头添加了这些行

<?php
require_once "vendor/autoload.php";
//insert
Zend'Loader'AutoloaderFactory::factory ( array (
        'Zend'Loader'StandardAutoloader' => array (
                Zend'Loader'StandardAutoloader::LOAD_NS => array (
                        "Application" => __DIR__ . "/../module/Application/src/Application" 
                ) 
        ) 
) );