【问题标题】:Create entity test for Symfony 2 bundle which doesn't have entities: The class was not found in the chain configured namespaces为没有实体的 Symfony 2 包创建实体测试:在链配置的命名空间中找不到该类
【发布时间】:2013-08-30 00:23:39
【问题描述】:

我们创建了一个捆绑包来将 CartoDB 集成到 Symfony2 项目中。此捆绑包本身不会创建任何实体,因为它会“侦听”您自己的实体上的持久或刷新等事件,以在您的数据和 cartodb 数据之间同步信息。这是工作流程:

创建一个实体对象 --> 持久化 --> 监听事件 --> 通过他们的 API 将数据添加到 cartoDB --> 获取 cartoDB 对象 id --> 在您创建的对象中更新它

这是 CartoDB Bundle 注释的示例:

/**
 * @ORM\Entity
 * @ORM\Table(name="testDB", options={"collate"="utf8_general_ci"})
 * @CartoDB\CartoDBLink(connection="private", table="testDB", cascade={"persist", "remove"})
 */

class TestDB
{
/**
* @ORM\Column(name="cartodb_index", type="integer", nullable=true)
* @CartoDB\CartoDBColumn(column="testdb_id", index=true)
*/
protected $cartodbId;  

我们想创建覆盖代码任何部分的测试,所以我们决定在 test 文件夹中包含一个 Entity 来测试与 cartoDB 数据的同步,并将其添加到 test 文件夹中,我们遵循以下步骤:

  1. 将 Doctrine Bundle 添加到我们的包 composer.json。
  2. 在这个路由中创建一个实体类:

Company/Tests/CartoDB/Entity/TestDB.php  

这个实体看起来像这样:

<?php

namespace Company\CartoDBBundle\Tests\CartoDB\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="testDB", options={"collate"="utf8_general_ci"})
* @CartoDB\CartoDBLink(connection="private", table="testDB", cascade={"persist", "remove"})
*/

class TestDB
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
.....
?>
  1. 现在轮到测试脚本了。我们使用实体命名空间:

    使用 Company\CartoDBBundle\Tests\CartoDB\Entity\TestDB;

接下来,我们创建一个实体对象:

$test = new TestDB();  
$test->setText("HI");  

运行正常,我们调用对象方法,一切正常,最后通过:

$em->persist($test);
$em->flush();  

Doctrine\Common\Persistence\Mapping\MappingException:在链配置的命名空间中找不到类 'Company\CartoDBBundle\Tests\CartoDB\Entity\TestDB'

这是我们的学说配置:

doctrine:  
dbal:  
  driver: pdo_sqlite  
  path: "%kernel.root_dir%/sqlite.db"  
  charset: UTF8  
orm:  
  auto_generate_proxy_classes: %kernel.debug%  
  auto_mapping: true  

不知道我们缺少什么,有人可以帮助我们吗?

【问题讨论】:

    标签: testing symfony doctrine bundle


    【解决方案1】:

    基本问题是默认情况下,Doctrine 只在 Bundle/Entity 目录中查找。因此,您需要在 orm: 下的配置文件中提供更多信息。

    手册有更多细节:http://symfony.com/doc/current/reference/configuration/doctrine.html

    doctrine:
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: false
        mappings:
            name:
                type: php
                dir: %kernel.root_dir%/../src/Company/CartoDBBundle/Tests/CartoDB/Entity
              # alias: MyModels
              # prefix: MyBundle\OtherNamespacePart\Entity
              # is_bundle: true
    

    您可能需要也可能不需要使用别名和前缀。正确配置后运行:

    app/console doctrine:schema:update --dump-sql 
    

    将转储表信息。

    【讨论】:

    • 感谢 Cedar,我会阅读有关此配置参数的信息。还有一件事,我们正在开发一个隔离包,这次我们没有应用程序/控制台来执行这些命令,还有其他方法可以获取转储信息吗?
    • 当然。 Symfony 命令只是对 Doctrine 命令的简单包装。 docs.doctrine-project.org/en/latest/reference/tools.html.
    • 太好了。感谢您的帮助@Cerad!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2014-10-24
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多