我有一个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');
答案 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。