集約ルート内のエンティティが集約ルートを経由せずに変更可能でない場合は、エンティティをすべて非公開または保護されたメンバーにすることによってエンティティに対するすべての変更を行わなければならない集合体を通して。それでも常に行うことができます
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を導入することができず、公に利用可能なメソッドを集約で使用する必要があります。
「良い」答えを呼ぶことができるかどうかはわかりませんが、集合体内のエンティティへのアクセスを真に制限することが考えられるのは唯一のことです。
[EDIT]:また、言及するのを忘れてしまった...ドキュメントの最も近いphpdocのため@internalがあるということです。 http://www.phpdoc.org/docs/latest/for-users/tags/internal.html
私はそれはしかし、IDEのコード補完を修正することを疑います。しかし、あなたはおそらくpublic function/propertyを作ることができますが、コード補完を避けるためにphpdocを使って "@access private"というラベルを付けることができます。
私は*集約*について言及していますが、実際にはいくつかのオブジェクトで構成されています。これらのオブジェクトはパブリックメソッドで一緒に通信する必要があります。私はPHPの限界を認識していて、Javaを真似しようとしないで、PHPコード解析ツールをヒントしてクラスの間違った使用を報告できるようにしようとしています。 – Benjamin