Anatomy of an Application Service

Once we have the data encapsulated in a request, it's time for the business logic. As Vaughn Vernon says: "Keep Application Services thin, using them only to coordinate tasks on the model."

The first thing to do is to extract the necessary information from the request, That is, the email and password. At a high level, we need to check if there's an existing user with a particular email. If this isn't the case, then we create and add the user to the UserRepository. In the special case of finding a user with the same email, we raise an exception so the client can treat it their own way — by displaying an error, retrying, or just ignoring it:

namespace LwApplicationServiceUser;

use DddApplicationServiceApplicationService;
use LwDomainModelUserUser;
use LwDomainModelUserUserAlreadyExistsException;
use LwDomainModelUserUserRepository;

class SignUpUserService
{
private $userRepository;

public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}

public function execute(SignUpUserRequest $request)
{
$email = $request->email();
$password = $request->password();

$user = $this->userRepository->ofEmail($email);
if ($user) {
throw new UserAlreadyExistsException();
}

$this->userRepository->add(
new User(
$this->userRepository->nextIdentity(),
$email ,
$password
)
);
}
}

Nice! If you're wondering what this UserRepository thing is doing in the constructor, we'll show you that next.

Handling Exceptions
Exceptions raised by Application Services are a way of communicating unusual cases and flows to the client. Exceptions on this layer are related to business logic (like not finding a user), and not implementation details (like PDOException, PredisException, or DoctrineException).
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset