По этой статье Вот
Вы можете думать о них [Сервисах] как о «Доменных объектах более высокого уровня», но вместо бизнес-логики Сервисы отвечают за взаимодействие между Доменными Объектами и Mappers. Эти структуры в итоге создают «открытый» интерфейс для взаимодействия с бизнес-логикой домена. Вы можете избежать их, но за счет утечки некоторой логики домена в контроллеры.
Я читал о MVC, и я разделил часть M на Services, Domain Objects и Data Mappers. Сервисы и Data Mappers легко понять, но я не понимаю причину доменных объектов, не могли бы вы привести несколько примеров? Вот мой код:
MemberService
class MemberService extends Service
{
public function authenticate()
{
$domainObject = $this->domainObjectFactory->getDomainObject('Member');
$dataMapper = $this->databaseFactory->getMapper('Member');
$_temp_sess_id = 0;
$_temp_sess_password = "";
$member = $dataMapper->fetch( $_temp_sess_id );
$authenticationResult = $domainObject->checkPassword( $member['password'], $_temp_sess_password );
if (!$authenticationResult)
{
$member = ['user_id' => 0];
}
return $member;
}
}
MemberDomainObject
class MemberDomainObject extends DomainObject
{
public function checkPassword( $dataMapperPassword, $locallyStoredPassword )
{
if ( $dataMapperPassword !== $locallyStoredPassword )
return false;
return true;
}
}
ОБНОВИТЬ:
Этот вопрос касается метода checkPassword и того, почему необходимо создать отдельный объект только для того, чтобы использовать оператор IF, который вместо этого можно использовать внутри службы, экономя ОЗУ от использования дополнительных ресурсов для создания нового объекта.
Вы только что создали MemberDomainObject через какую-то фабрику в вашем примере. Код, который вы показываете, не имеет нулевого информационного значения для этой цели.
Вам нужно создать реальное приложение с минимальным количеством объектов, служб и двух доменов, чтобы каждый мог сказать: «Вы хорошо используете объекты домена».
Вас не интересуют только «модельные объекты»? Не нужно говорить об объектах домена, если вы хотите быть уверены в правильном использовании отношения «сервис> фабрика> объект модели> маппер».
Хорошей практикой является создание объектов через фабрику, так как вы можете изменять или добавлять вызовы конструктора во время рефакторинга в одном месте.
Один совет: используйте имена классов с пространствами имен (FQN) на ваших фабриках, это поможет вам с навигацией по коду и с рефакторингом, а также
$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::class); //in php5.5+
Вы можете заменить на
class DomainObject
{
static function className(){
return get_called_class();
}
}
$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::className());
в php <= 5.4 и замените его при обновлении.
так же, как
$member = $this->domainObjectFactory->getMember();
это не проблема, так как вы можете указать возвращаемый тип в :: getMember ()
Других решений пока нет …