条令ORM映射不适用于分离的Symfony 2捆绑包

条令ORM映射不适用于分离的Symfony 2捆绑包,symfony,doctrine-orm,Symfony,Doctrine Orm,我有一个Symfony bundle,它使用orm和这样的实体类 namespace Acme\ECWDatabaseBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Bundle * * @ORM\Entity * @ORM\Table(name="forecast.Bundle") */ class Bundle { 我已经将它分离到它自己的捆绑包中,以便我们所有的应用程序都可以通过composer将其拉入。在我的开发

我有一个Symfony bundle,它使用orm和这样的实体类

namespace Acme\ECWDatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Bundle
 *
 * @ORM\Entity
 * @ORM\Table(name="forecast.Bundle")
 */
class Bundle
{
我已经将它分离到它自己的捆绑包中,以便我们所有的应用程序都可以通过composer将其拉入。在我的开发机器上运行这可以正常工作,在测试服务器上运行它在内置到应用程序(在
src
文件夹中)时可以正常工作。但就其本身而言,我会犯很多这样的错误

namespace Acme\ECWDatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Bundle
 *
 * @ORM\Entity
 * @ORM\Table(name="forecast.Bundle")
 */
class Bundle
{
Doctrine\Common\Annotations\AnnotationException:[语义错误]Acme\ECWDatabaseBundle\Entity\Bundle类中的注释“@Doctrine\ORM\Mapping\Entity”不存在,或无法自动加载。

这是分离包中composer文件的一部分

"require": {
    "php": ">=5.3.17",
    "doctrine/orm": "2.3.*",
    "doctrine/doctrine-bundle": "~1.2"
},
"require-dev": {
    "symfony/symfony" : "2.*@stable",
    "symfony/monolog-bundle" : "~2.7.0"
}
从Resources/config/Doctrine/bundle.orm.yml文件中摘录

Acme\ECWDatabaseBundle\Entity\Bundle:
type: entity
table: forecast.Bundle
id:
    id:
        type: integer
        nullable: false
        id: true
        generator:
            strategy: SEQUENCE
fields:
    ecoconnect_id:
        type: integer
        nullable: true
    configuration_name:
        type: string
        length: 500
        nullable: true
    latitude:
        type: float
        nullable: true
    longitude:
        type: float
        nullable: true
更新:从失败的测试报告堆栈跟踪

Niwa\ECWDatabaseBundle\Tests\Entity\BundleEntityTest::testRecentBundlePeriods
Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation "@Doctrine\ORM\Mapping\Entity" in class Niwa\ECWDatabaseBundle\Entity\Bundle does not exist, or could not be auto-loaded.

/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php:54
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php:708
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php:641
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php:334
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php:194
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php:95
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php:61
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php:103
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:113
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:318
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php:211
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:268
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:682
/repository/jenkins/jobs/ECWDatabaseBundle/workspace/Tests/Entity/BundleEntityTest.php:36
BundleEntityTest.php中的代码片段

class BundleEntityTest extends KernelTestCase
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    /**
     * {@inheritDoc}
     */
    public function setUp()
    {       
        self::bootKernel();
        $this->em = static::$kernel->getContainer()
                ->get('doctrine')
                ->getManager()
                ;
    }
    public function testRecentBundlePeriods()
    {

        $bundleRepository = $this->em->getRepository('NiwaECWDatabaseBundle:Bundle');

从条令文件():

这些注释是如何加载的?通过查看代码,您可以 猜测ORM映射。。。可以使用定义的 PHP自动加载器但情况并非如此:用于错误处理 解释每次检查AnnotationReader中是否存在类的原因 设置类_exists的第二个参数$autoload($name,$autoload) 这是错误的。要完美地工作,AnnotationReader需要保持沉默 许多自动装弹机都不是的自动装弹机。无提示自动加载不可用 PSR-0自动加载规范的一部分

因此,您可能希望在composer.json中包含
“条令/注释”
,如果失败,请仔细查看文档。

上下文
  • 在我的开发机器上运行,运行正常
  • 在测试服务器上运行,当内置到应用程序中(在src文件夹中)时,它可以正常工作
  • 但就其本身而言,我会犯很多这样的错误
我从中得出的结论是,您试图在没有Symfony的情况下使用捆绑包。我真的不确定你会怎么做(除了测试),但我不能从这些陈述中推断出其他任何东西

如果我错了,那么这个答案就毫无意义了:)

问题 为了使注释正确运行,需要配置条令。Symfony中的条令配置通常由/与完成

与Symfony、Doctrine和其他库/包相关的许多其他内容也是如此

因此,为了让注释正常工作,您需要在Symfony中注册DoctrineBundle和您的bundle,并且可能需要稍微更改Symfony配置文件

测试 在单独测试捆绑包(在某些CI环境中)时,您可能希望自己“使用”捆绑包。在本例中,您正在运行单元测试

只要您想要运行其他类型的测试,比如集成测试,您就需要配置您想要集成的任何依赖项。仅仅用Composer安装这些依赖项是不够的


关于如何在测试套件中手动配置条令,您可以咨询。

我已经自动加载了PSR-4,并且加载了
条令/注释
,因为条令/通用需要它。在单独的捆绑包中,您是否告诉composer它是一个Symfony捆绑包?您可以使用
“type”:“symfony bundle”、
,或查看更多详细信息。它不在那里,所以我尝试了它,但没有任何区别。您如何“单独”使用symfony bundle?它不是一个将此bundle引入供应商的symfony应用程序。这个包是主要的来源。然后它有自己的composer.json,它会拉入它需要的其他捆绑包。如果没有Symfony本身,我不会运行这个捆绑包,Symfony在composer.json中作为require dev列出,并被拉入供应商文件夹。其他部分如教义和独白也是如此。对于这个包和我正在开发的其他包,这个过程在我的开发机器上运行良好。但是,在我的自动测试服务器上,对于这个包含所有条令注释的捆绑包,相同的过程不起作用,其他捆绑包工作正常,包括那些需要AppKernel文件和其他Symfony位的捆绑包。您应该在问题中提到,您正试图在某些CI环境中单独测试捆绑包,您正在使用什么测试框架,以及您正在运行什么类型的测试。“…对于这一个包…,其他包工作正常”此设置看起来如何?如果失败的包是唯一使用ORM注释的包,我会说这些注释没有正确注册。这就是为什么我要求设置。你在那个设置中做了什么来配置条令?Thanx!我现在要睡觉了,明天再去看看。