8

私は良い設計を実践し、Doctrine エンティティを拡張しようとしています。基本的に私の拡張クラスであるモデルには、追加のビジネス ロジックとエンティティの基本データへのアクセスが含まれます。

Doctrine 2.2.1 & Zend Framework 1.11.4 & php 5.3.8 を使用しています

DQL を使用すると、doctrine は Model エンティティを正常に返します。Doctrine ネイティブの find() 関数を使用すると、何も返されません :(.

ヘルプ...

これはそれがどのように転がるかです:

Bootstrap.php :

    $classLoader = new \Doctrine\Common\ClassLoader('Entities', APPLICATION_PATH.'/doctrine');
    $classLoader->register();
    $classLoader = new \Doctrine\Common\ClassLoader('Models', APPLICATION_PATH);
    $classLoader->register();

APPLICATION_PATH\models\User.php のモデル:

namespace Models;
use Doctrine\ORM\Query;

/**
 * Models\User
 *
 * @Table(name="user")
 * @Entity
 */
class User extends \Entities\User {

public function __wakeup() {
    $this->tools = new Application_App_Tools();
}

エンティティ検索機能:

機能しません:

$userEntity = $registry->entityManager->find('Models\User', $userEntity);

作品

$qry = $qb
        ->select('u')
        ->from('Models\User','u'); 
4

3 に答える 3

4

エンティティにビジネス ロジックを追加するのではなく、代わりにモデルを使用する必要があります。それを行う1つの方法は次のとおりです。

  1. ビジネス ロジックにモデルを使用します。
  2. すべてのデータベース クエリ (DQL またはその他) 用のカスタム Doctrine 2 リポジトリを作成します [1]。
  3. エンティティはそのままにしておいてください。

実際には、これはモデルが単純な PHP クラス (または、使用しているものに応じて拡張されたフレームワーク) であることを意味しますが、モデルはデータベースとは関係ありません。ただし、モデルはカスタム Doctrine 2 リポジトリをインスタンス化します。たとえば、 aUserRepositoryには と呼ばれるメソッドが含まれる場合がありますgetUserById。リポジトリ内で、実際のクエリを実行し、モデルが動作するエンティティ インスタンスを返します。

[1] http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#custom-repositories

于 2013-08-07T02:34:16.543 に答える
1

私が理解しているように、DoctrineentityManagerは永続的なエンティティに対してのみ責任を負い、エンティティを拡張Entities\UserするModel\Userと別のエンティティ (docblock に記載されているのと同じテーブルに格納されます) が作成されますが、おそらく docblock で言及してentityManagerいないため、それによって管理されたり衝突したりしません:@InheritanceType("SINGLE_TABLE")Entities\User

詳細については、このドキュメントを参照してくださいhttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

于 2012-08-29T14:30:21.020 に答える
0

私がやろうとしたことは悪い習慣でした。@Ivan Hušnjakが言及したように、DBエンティティとzendのツールを結合しました。

すべきことは、デカップリングです。

ビジネス ロジックは services\controller にある必要があり、これらはエンティティとそのメソッドに対応する必要があります。エンティティ プロパティのみに関連する教義エンティティにヘルパー関数を追加できます。

私の主な目的 (Doctrine CLI が書き換えおよび更新できるエンティティ クラスを持つこと) に関して: doctrine はネイティブ フィールド\メソッドの変更からのみ検索し、それに応じてそれらを更新し、他のすべての関数 (ヘルパー) を破棄します。そのため、doctrine に php エンティティを更新させても問題ありません!

ps symfony2 に移動します。

于 2013-02-05T12:15:09.750 に答える