尝试在 zf2 / 学说下的实体之间创建继承时出现“找不到类”

Posted

技术标签:

【中文标题】尝试在 zf2 / 学说下的实体之间创建继承时出现“找不到类”【英文标题】:"Class not found" when trying to create inheritance between entities under zf2 / doctrine 【发布时间】:2015-03-27 08:44:01 【问题描述】:

我在 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

CapteurResident 和 CapteurEmbarque 是两个以完全相同的方式扩展 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

这里是 Capteur 类:

<?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;

【问题讨论】:

你是不是忘了使用 InheritanceType、DiscriminatorColumn 和 DiscriminatorMap 注解?有些家伙遇到了同样的问题doctrine-project.org/jira/browse/DDC-615 【参考方案1】:

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

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

<?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" 
                ) 
        ) 
) );

【讨论】:

我的实体依赖项有这个问题。感谢您提供简单的解决方案。

以上是关于尝试在 zf2 / 学说下的实体之间创建继承时出现“找不到类”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用条件关联建立 ZF2 学说实体

ZF2:我在哪里存储 partialLoop 模板文件?

学说 Symfony2 坚持与现有的关联实体

尝试从 SAP HANA DB 创建实体模型时出现连接错误

当我尝试使用 symfony 创建实体时出现 Aborted 错误消息 [重复]

zf2 + 学说 2 上的用户定义函数不起作用