0

CartoDB を Symfony2 プロジェクトに統合するためのバンドルを作成しました。このバンドルはエンティティ自体を作成しません。これは、データと cartodb データの間で情報を同期するために、独自のエンティティで永続化やフラッシュなどのイベントを「リッスン」するためです。ワークフローは次のとおりです。

エンティティ オブジェクトを作成します --> 永続化 --> イベントをリッスンします --> API を介して cartoDB にデータを追加します --> cartoDB オブジェクト ID を取得します --> 作成したオブジェクトで更新します

CartoDB バンドル アノテーションの例を次に示します。

/**
 * @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;  

コードの任意の部分をカバーするテストを作成したいので、cartoDB データとの同期をテストするために test フォルダーにエンティティを含め、それを test フォルダーに追加することにしました。次の手順に従いました。

  1. Doctrine バンドルをバンドル 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  

何が欠けているのかわからない、誰か助けてくれる?

4

1 に答える 1

0

基本的な問題は、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 

テーブル情報をダンプします。

于 2013-08-27T15:14:03.673 に答える