Doctrine ORM映射不适用于分离的Symfony 2 bundle

时间:2015-03-03 22:05:52

标签: symfony doctrine-orm

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

namespace Acme\ECWDatabaseBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Bundle
 *
 * @ORM\Entity
 * @ORM\Table(name="forecast.Bundle")
 */
class Bundle
{

我将它分成了自己的捆绑包,这样我们所有的应用都可以通过作曲家将其拉出来。在我的开发机器上运行可以正常运行,在测试服务器上运行它在内置到应用程序(在src文件夹中)时工作正常。但就其本身而言,我会遇到很多很多错误

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

这是分离包

中作曲家文件的一部分
"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');

2 个答案:

答案 0 :(得分:0)

来自Doctrine Documentation(annotations):

  

这些注释是如何加载的?从你可以看到的代码   猜测ORM Mapping,...可以使用定义的方式加载   PHP自动加载器。 但情况并非如此:用于错误处理   原因是每次检查AnnotationReader中是否存在类   设置class_exists的第二个参数$ autoload($ name,$ autoload)   为假。为了完美地工作,AnnotationReader需要安静   许多自动装载机不是自动加载机。无声自动加载不是   用于自动加载的PSR-0规范的一部分。

因此,您可能希望在composer.json中包含"doctrine/annotations",或者如果失败则需要仔细查看文档。

答案 1 :(得分:0)

上下文

  
      
  • 在我的开发机器上运行就可以了。
  •   
  • 在测试服务器上运行时,它在内置到应用程序(在src文件夹中)时可以正常工作。
  •   
  • 但是我自己会遇到很多这样的错误。
  •   

我从中收集到的是,您尝试使用没有Symfony本身的捆绑包。我不确定你会怎么做(除了测试),但我不能从这些陈述中推断出其他任何东西。

如果我错了,这个答案没有任何意义:)

问题

要使注释正常运行,需要配置Doctrine。 Symfony中的Doctrine配置通常由/ DoctrineBundle完成。

与Symfony,Doctrine和其他库/包相关的许多其他事情也是如此。

因此,为了使注释正常运行,您需要在Symfony中注册DoctrineBundle和您的包,并且可能会稍微更改Symfony配置文件。

测试

单独测试捆绑包(在某些CI环境中)将是您希望单独“使用”捆绑包的情况。在这种情况下,您正在运行单元测试。

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

您可以参考Doctrine documentation了解如何在测试套件中手动配置Doctrine。