Доброе утро,
Я много раз читал, что в AR следует избегать как сеттеров, так и геттеров.Хотя я могу понять причину сеттеров, я немного не согласен с геттерами, когда они явно являются частью бизнеса.
Давайте представим следующее Пользователь AR:
namespace vendor\Domain\Model;
class User
{
private $userId;
private $username;
private $password;
private $email;
static public register(...): User { ... } // Ubiquitous Language
public function unregister(...) { ... } // Ubiquitous Language
public function changePassword(...) { ... } // Ubiquitous Language
public function changeEmail(...) { ... } // Ubiquitous Language
public function getAggregateId(): UserId { ... } // A getter
public function getUsername(): UserName { ... } // A getter
public function getEmail(): UserEmail { ... } // A getter
...
}
Теперь давайте представим следующий UserRepository интерфейс:
namespace vendor\Domain;
interface UserRepository
{
public function userOfId(UserId $userId):? User;
public function userOfname(UserName $userName):? User;
public function userOfEmail(UserEmail $userEmail):? User;
...
}
По сути, у меня есть несколько искателей, которые позволяют получить User с помощьюего идентификатор, имя пользователя или адрес электронной почты.
Теперь давайте представим следующую в памяти реализацию этого UserRepository :
namespace vendor\Infrastructure\Persistence;
use vendor\Domain\UserRepository;
class InMemoryUserRepository implements UserRepository
{
/** User[] */
private $users;
public function userOfId(UserId $userId):? User
{
if(!isset($this->users[$userId->tostring()]) {
return null;
}
$this->users[$userId->tostring()];
}
public function userOfEmail(UserEmail $userEmail):? User
{
foreach($users as $user) {
if($user->getEmail()->sameValueAs($userEmail) {
return $user;
}
}
return null;
}
...
}
Как вы можете видеть, в этой реализации в памяти мне нужно фильтровать пользователей по электронной почте, получая доступ к их свойствам электронной почты.Это обязательно означает, что Пользователь AR должен предоставить getEmail () getter.Это действительно плохо?Разрешено иметь геттеры для свойств, которые должны быть доступны?Стоит ли просто учитывать, что метод получения getEmail () имеет деловое значение, и в этом случае он совершенно действителен?