German Malinovsky
Новичок
Есть самый простой процесс регистрации пользователя, где он вводит мыло и пароль и сразу же под ними может зайти на сайт. Но понадобилось добавить дополнительную функциональность (которая гдето в админке активируется и деактивируется), что вызывается при завершении регистрации. Например, подтверждение регистрации. Но функциональность подтверждения нельзя явно в пишивать в текущую реализацию регистрации (напр. добавить флаг $confirmationRequired в контроллере и там же добавить все логику с ней связаную). Для этого она вынесена в UserConfirmationListener что сразабывает при событии завершения регистрации.
UserConfirmationListener вклинивается неявно в процесс регистрации, и мне нужно не только изменить сам объект по контракту UserInterface, но и немного изменить поведение ответа приложения(Если раньше нужно было перенаправлять при успешной регистрации по URL /confirmed, то теперь вместо него на URL /confirmation)
Я это сделал через метод setResponse() в UserEvent, и потом в метода registerUser() его возвращаю. Все работает, но мне кажется это слишком грязно. вызывается метод регистрации, в котором могут быть разные события вызваны, но логично было бы возвратить свежесозданные объект $user.
Вынести вызов события можно было бы в контроллер, но оно же должен вызываться непосредственно перед сохранием нового объекта(т.е. перед $user->save())
Так вот вопрос в том как это можно бы улучшить? Т.е. более продумано подменять стандартный Response новым объектом Response или изменять поведение приложения, при этом это было "loose coupling" как я сделал с добавлением Listener, ведь неизвестно сколько еще может быть подобных дополнительных функциональностей.
Псевдокод
UserConfirmationListener вклинивается неявно в процесс регистрации, и мне нужно не только изменить сам объект по контракту UserInterface, но и немного изменить поведение ответа приложения(Если раньше нужно было перенаправлять при успешной регистрации по URL /confirmed, то теперь вместо него на URL /confirmation)
Я это сделал через метод setResponse() в UserEvent, и потом в метода registerUser() его возвращаю. Все работает, но мне кажется это слишком грязно. вызывается метод регистрации, в котором могут быть разные события вызваны, но логично было бы возвратить свежесозданные объект $user.
Вынести вызов события можно было бы в контроллер, но оно же должен вызываться непосредственно перед сохранием нового объекта(т.е. перед $user->save())
Так вот вопрос в том как это можно бы улучшить? Т.е. более продумано подменять стандартный Response новым объектом Response или изменять поведение приложения, при этом это было "loose coupling" как я сделал с добавлением Listener, ведь неизвестно сколько еще может быть подобных дополнительных функциональностей.
Псевдокод
PHP:
class UserEvent
{
public function __construct(UserInterface $user)
{
$this->user = $user
}
public function getUser()
{
return $this->user;
}
public function setResponse(ResponseInterface $response)
{
$this->response = $response;
}
public function getResponse()
{
return $this->response;
}
}
class UserConfirmationListener
{
//Вызывается при событии user.registration.suсcess
public function onUserRegistrationComplete(UserEvent $event)
{
$user = $event->getUser();
$user->enabled = false;
$user->confirmationCode = "random string";
$response = Response::url("/confirmation");
$this->setResponse($response);
}
}
class UserService()
{
public function registerUser($email, $password, $enable = false)
{
$user = new User($email, $password);
if ($enable)
{
$user->enabled = true;
}
$event = new UserEvent($user)
$this->eventDispatcher->fire('user.registration.suсcess', $event);
$user->save();
if (null !== $response = $event->getResponse())
{
return $response;
}
}
}
class UserController()
{
public function registerAction()
{
if (!empty($_POST))
{
//если не возвращали response, то берем стандартный
if (null === $response = $this->userService->registerUser($_POST['email'], $_POST['password']){
$response = Response::url("/confirmed");
}
return $response;
}
return Response::template("path/to/template");
}
public function confirmedAction()
{
//Показывает страницу, с сообщением об успешной регистрации.
}
public function confirmationAction()
{
//Показывает страницу, где описано что делать дальше чтобы подтвердить аккаунт и соответвенно завершить регистрацию
}
}
Последнее редактирование: