집계 루트 내의 엔티티가 집계 루트를 거치지 않고 수정할 수 없으면 엔티티를 개인 또는 보호 된 구성원으로 설정하여 엔티티에 대한 모든 수정을 수행해야한다는 것을 제어해야한다는 것을 의미합니다 집합체를 통해
class RootEntity {
private $_otherEntity;
public function DoSomething() {
$this->_otherEntity->DoSomething();
}
public function setOtherEntity(OtherEntity $entity) {
$this->_otherEntity = $entity;
}
}
사람은 여전히 항상 수행 할 수 있습니다
$otherEntity = new OtherEntity();
$otherEntity->DoSomethingElse();
$rootEntity->setOtherEntity($otherEntity);
비록, 당신이 어디 건설하는 동안을 제외하고 _otherEntity의 설정을 금지하는 마법의 __call() 메소드를 사용할 수있는 것 같아요. 이 개체를 빌드 할 때
class RootEntity {
private $_otherEntity;
private $_isLoaded = false;
public function __call($method, $args) {
$factoryMethod = 'FactoryOnly_'.$method;
if(!$this->_isLoaded && method_exists($this,$factoryMethod) {
call_user_func_array(array($this,$factoryMethod),$args
}
}
public function IsLoaded() {
$this->_isLoaded = true;
}
protected function FactoryOnly_setOtherEntity(OtherEntity $otherEntity) {
$this->_otherEntity = $otherEntity;
}
}
그래서, 거기에서, 당신이 당신의 공장 또는 저장소에서 $ agg-> setOtherEntity ($ otherEntity)를 호출 할 수 있습니다 전체 해킹 카테고리 :에 해당. 그런 다음 객체 작성을 완료하면 IsLoaded()를 호출하십시오. 거기에서 다른 누구도 클래스에 새 OtherEntity를 도입 할 수 없으며 집계에서 공개적으로 사용 가능한 메소드를 사용해야합니다.
"좋은"대답이라고 부를 수 있는지 확실하지 않지만 집계 안의 엔티티에 대한 액세스를 정말로 제한하기 위해 생각할 수있는 유일한 방법입니다.
[편집] : 그러나, http://www.phpdoc.org/docs/latest/for-users/tags/internal.html
나는 그것이 IDE의 코드 완성을 수정합니다 의심 : 또한, ... 문서의 가장 가까운하는 PHPDoc에 대한 @internal이 있음을 언급하는 것을 잊었다. 하지만 공용 함수/속성을 만들 수도 있지만 "@access private"이라는 레이블을 phpdoc로 지정하여 코드 완성을 막을 수 있습니다.
* 집합체 *에 대해 이야기 할 때 실제로 여러 객체로 구성되어 있으며 공용 메서드로 서로 통신해야합니다. 나는 PHP의 한계를 잘 알고 있고, 자바를 실제로 모방하려는 것이 아니라 PHP 코드 분석 도구를 암시하여 클래스의 잘못된 사용 가능성을보고 할 수 있습니다! – Benjamin