我在一对一关联中有 2 个实体。第一个,Person
存储在 MySQL 数据库中并由 Doctrine 处理。第二个,AdUserRecord
描述 ActiveDirectory 用户记录。它是只读的。它不需要知道Person
。此外, AdUserRecord
出于隐私原因,属性不应存储在 MySQL 数据库中。
AdUserRecord
使用服务检索An AdSearcher
,该服务可以通过samaccountname
或进行搜索objectGUID
。每当搜索成功时,服务都会检查是否有相应的Person
记录,如果没有则创建一个。这很好用。
当我从一个Person
对象开始时会出现我的问题。大多数情况下,我不需要访问Person
's 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 文档,但我仍然感到困惑。
问题
- 如何将服务获取到实体中?它应该通过构造函数注入,还是仅仅在 getter 中需要的地方注入?如果它只出现在 getter 中,我必须注入它还是有办法导入它?
- 向实体添加服务是处理这些类型情况的规范方法吗?为
AdUserRecord
s 建立一个实体管理器会更好吗? - 如果我必须构建实体管理器,我需要实现哪些接口?
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
}