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
。はすでに定義されています。Profiles
id
id
ただし、Work
クラスの列を追加しようとしましたが、列が既にあるというメッセージが表示されますid
。ドー!
PK に他の列名を追加しようとしましたが、適切な継承列も作成されるため、実際には不要な余分な列が取得されます。id
CTI では、単一の FK 列が必要であり、自動生成された値を持つ他の PK はありません。
だから私はドクトリンクラスをハックして、欠落しているIDのチェックを削除するという悪いことをしました。醜いですが、うまくいきました。エンティティが適切に生成され始め、db 構造に問題はありません。
後で、奇妙な動作はすべて doctrine 2 のバグによるものであり、2.0.5で修正されていることがわかりました。
さて、私は 2.0.5 を試してみましたが、まったく同じ問題があったので、間違いは私のコードにあると思いました。
doctrine の jira にバグを報告したところ、私の定義が間違っていて、サブクラスの ID が必要であるという回答がありました (特に YAML マッピングに関して、私たちが知っていることはすべて非常に貧弱であるというドキュメントを参照しました)。私はあきらめて、自分のハックに固執しました。
後で 2.0.6 と 2.1 を試しましたが、これらのバージョンではエンティティが更新されなくなりましたが、generate-entities を使用するたびに新しいクラス定義が最後に追加されるため、重複があります。
私の質問は:
これは教義の問題ですか、それとも間違っていますか?
それが私の中にある場合、CIをマッピングする適切な方法は何ですか