1 対 1 の関連付けに 2 つのエンティティがあります。最初のPerson
は MySQL データベースに保存され、Doctrine によって処理されます。2 番目の はAdUserRecord
、ActiveDirectory ユーザー レコードを記述します。読み取り専用です。について知る必要はありませんPerson
。また、 AdUserRecord
プライバシー上の理由から、プロパティを MySQL db に保存しないでください。
は、またはで検索できるAdUserRecord
サービス を使用して取得されます。検索が成功するたびに、サービスは対応するレコードがあるかどうかを確認し、存在しない場合はレコードを作成します。それはうまくいきます。AdSearcher
samaccountname
objectGUID
Person
私の問題は、Person
オブジェクトから始めるときに発生します。ほとんどの場合、 にアクセスする必要はないので、必要でPerson
ないAdUserRecord
限り Active Directory にクエリを実行したくありません。つまりPerson::getAdrecord()
、サービスにアクセスできる必要があると思いAdSearcher
ます。このようなもの:
public function getAdrecord(){
if($this->adrecord) return $this->adrecord;
$searcher = ???; //get AdSearcher service somehow
$record = $search->getRecordByUserGuid($this->ad_guid);
if(!$record) throw new \Exception('this person no longer exists');
$this->adrecord = $record;
return $this->adrecord;
}
私はかなり熱心に Symfony のドキュメントを読んできましたが、まだ困惑しています。
質問
- エンティティにサービスを取得するにはどうすればよいですか? コンストラクターを介して注入する必要がありますか、それともゲッターの必要な場所に注入する必要がありますか? ゲッターでのみ発生する場合、それを注入する必要がありますか、それともインポートする方法はありますか?
- エンティティにサービスを追加することは、これらのタイプの状況を処理する標準的な方法ですか? s用のエンティティ マネージャを作成するのが望ましいでしょう
AdUserRecord
か? - エンティティ マネージャを構築する必要がある場合、どのインターフェイスを実装する必要がありますか?
Person
クラス
namespace ACRD\DefaultBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use ACRD\DefaultBundle\Entity\AdUserRecord;
/**
* @ORM\Entity
* @Orm\Table(name="person")
*
*/
class Person {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(name="AD_guid", type="string", length=36, unique=true)
*/
protected $ad_guid;
/**
* @var AdUserRecord
*/
protected $adrecord;
//usual getters and setters
}