It's common to encounter infrastructural dependencies when modeling a Domain Service — for example, in the case where an authentication mechanism that handles password hashing is required. In this instance, you could use a Separated Interface, which allows for multiple hashing mechanisms to be defined. Using this pattern still provides you with a clear Separation of Concerns between the Domain and the Infrastructure:
namespace Ddd\Auth\Domain\Model; interface SignUp { public function execute($aUsername, $aPassword); }
Using the preceding interface found in the Domain, we could create an implementation in the Infrastructure layer, like the following:
namespace Ddd\Auth\Infrastructure\Authentication; class DefaultHashingSignUp implements Ddd\Auth\Domain\Model\SignUp { private $userRepository; public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } public function...