2

CTI を実装しようとすると多くの問題が発生します

まず、エンティティ クラスにカスタム ローダーを使用します。

class My_AutoLoader implements Zend_Loader_Autoloader_Interface
{

    public function autoload($class)
    {
        $class = trim(str_replace('\\', '/', $class), '/');
        if (@include(APPLICATION_PATH . '/Entities/' . $class . '.php')) {
            return $class;
        } else {
            throw new Zend_Loader_Exception('Cannot load ' . $class . '.');
        }
    }

}

アイデアは、application\Entities次のような名前空間を持たないクラスに使用することです$user = new Users();

次に、クラス継承を定義しました

Profiles:
  type: entity
  table: profiles
  repositoryClass: Repositories\Base
  inheritanceType: JOINED
  discriminatorColumn:
    name: profiletype
    type: integer
    length: 11
  discriminatorMap:
    1: Personal
    2: Work
    3: Business
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    firstname:
      type: string
      length: 255
      fixed: false
      nullable: true
    ...


Work:
  type: entity
  table: work
  repositoryClass: Repositories\Base
  fields:
    position:
      type: string
      length: 255
      fixed: false
      nullable: true

次に、クラス Work を手動で作成してプロファイルを拡張しました

class Work extends Profiles
{
}

最初の問題は 2.0.0 (2.0.1) で始まりました。コンソール ツールのgenerate-entitiesを使用すると、クラスの ID がないWorkというエラーが表示されますWork。はすでに定義されています。Profilesid

idただし、Workクラスの列を追加しようとしましたが、列が既にあるというメッセージが表示されますid。ドー!

PK に他の列名を追加しようとしましたが、適切な継承列も作成されるため、実際には不要な余分な列が取得されます。idCTI では、単一の FK 列が必要であり、自動生成された値を持つ他の PK はありません。

だから私はドクトリンクラスをハックして、欠落しているIDのチェックを削除するという悪いことをしました。醜いですが、うまくいきました。エンティティが適切に生成され始め、db 構造に問題はありません。

後で、奇妙な動作はすべて doctrine 2 のバグによるものであり、2.0.5で修正されていることがわかりました。

さて、私は 2.0.5 を試してみましたが、まったく同じ問題があったので、間違いは私のコードにあると思いました。

doctrine の jira にバグを報告したところ、私の定義が間違っていて、サブクラスの ID が必要であるという回答がありました (特に YAML マッピングに関して、私たちが知っていることはすべて非常に貧弱であるというドキュメントを参照しました)。私はあきらめて、自分のハックに固執しました。

後で 2.0.6 と 2.1 を試しましたが、これらのバージョンではエンティティが更新されなくなりましたが、generate-entities を使用するたびに新しいクラス定義が最後に追加されるため、重複があります

私の質問は:

これは教義の問題ですか、それとも間違っていますか?

それが私の中にある場合、CIをマッピングする適切な方法は何ですか

4

1 に答える 1

0

あなたの質問からの引用:

更新: 問題は実際にはDoctrineのバグであり、エンティティを更新するときに名前空間の前に常に「\」が付いており、カスタムオートローダーは名前空間のないクラスのみをロードすることがわかりました。さらに、プロパティ(ID)の継承にバグがあります

両方とも2.1.1で修正されます

于 2011-09-16T12:25:46.337 に答える