noLogicOnlyWar писал(а): ↑2017.12.25, 22:47
Лучше юзера, тк login($user) логично и соответствует терминам предметной области.
А вот мне теперь кажется, что передавать нужно сессию (абстракцию).
Сессия это по сути identity юзера.
И в методе authenticate доменного сервиса сам юзер не нужен по сути.
Этот метод обновит данные сессии (время аутентификации, IP итд), либо кинет исключение, что сессия не валидна (истек срок, например).
Иначе, как метод authenticate определит по какой сессии аутентифицировать юзера?
Код: Выделить всё
public function authenticate(AuthenticationSession $authenticationSession);
noLogicOnlyWar писал(а): ↑2017.12.25, 22:47
(кстати нужно ли знать домену о существование сессии? видимо нет, ведь это конкретное хранилище некоторых данных).
Я имел в виду абстракцию AuthSession. Разумеется, об инфраструктуре домен не знает.
noLogicOnlyWar писал(а): ↑2017.12.25, 22:47
Только в AuthenticationSession::$staffMember надо $staffMemberId хранить
тоже думал об этом, согласен, незачем усложнять.
Набросал черновик, что думаешь?
Код: Выделить всё
namespace Domain\Services;
class AuthenticationService
{
public function authenticate(AuthenticationSession $authenticationSession) { ... }
...
}
//=====================================================
namespace Application\Services;
interface AuthenticationServiceInterface
{
public function authenticate(): void;
...
}
//=====================================================
namespace Infrastructure\Services;
class SessionAuthenticationService implements AuthenticationServiceInterface
{
public function __construct(YiiSession $session, AuthSessionRepository $repo, AuthenticationService $authService) { ... }
public function authenticate()
{
$sessionId = $this->session->id;
$authSession = $this->repo->get($sessionId);
$this->authService->authenticate($authSession);
$this->repo->save($authSession);
}
...
}
Тут меня больше интересует то, что в app layer лежит интерфейс, а реализуется он в infrastructure, это правильный подход?