Сервисные ссылки
Иногда возникает необходимость сделать какие либо действия над пользователем. Например после регистрации пользователя выслать ему ссылку подтверждения или ссылку восстановления пароля. Для таких целей используется класс Reflinks
.
Сервисные ссылки делятся на типы и вы можете добавлять свои типы. Для примера в системе реализован механизм восстановления пароля пользователя
Каждый тип ссылки представляет из себя 2 класса:
Класс генератор отвечает за передачу необходимых параметров в объект ссылки, а также может выполнять какие либо операции после генерации ссылки.
Класс необходимо наследовать от интерфейса KodiCMS\Users\Contracts\ReflinkGeneratorInterface
Пример:
use Bus; use KodiCMS\Users\Model\User; use KodiCMS\Email\Jobs\EmailSend; use KodiCMS\Users\Model\UserReflink; use KodiCMS\Users\Contracts\ReflinkGeneratorInterface; use KodiCMS\Users\Reflinks\Handlers\UserRegisterHandler; class UserRegisterGenerator implements ReflinkGeneratorInterface { /** * @var User */ protected $user; /** * @var array */ protected $properties = []; /** * @param User $user * @param array $properties * * @throws ReflinkException */ public function __construct(User $user, array $properties = []) { $this->user = $user; } /** * Класс обработчика, который необходимо вызвать в момент использования токена * * @return string */ public function getHandlerClass() { return UserRegisterHandler::class; } /** * Пользователь, для которого необходимо сгенерировать токен * * @return User * @throws ReflinkException */ public function getUser() { return $this->user; } /** * Параметры, которые будут сохранены вместе с токенов в БД, * которые можно будет использовать в обработчике * * @return array */ public function getProperties() { return $this->properties; } /** * Токен сгенерирован и можно отправить его пользователю * * @param UserReflink $reflink */ public function tokenGenerated(UserReflink $reflink) { // Отправляем пользователю ссылку подтверждения Bus::dispatch(new EmailSend('user_register', [ 'token' => $reflink->token, 'username' => $reflink->user->username, 'email' => $reflink->user->email, 'reflink' => $reflink->linkToken() ])); } }
Класс обработчик, которые будет вызван в тот момент, когда пользователь переходит по ссылке с токеном
Класс необходимо наследовать от интерфейса KodiCMS\Users\Contracts\ReflinkHandlerInterface
use CMS; use Bus; use KodiCMS\Users\Model\UserReflink; use KodiCMS\Users\Contracts\ReflinkHandlerInterface; class UserRegisterHandler implements ReflinkHandlerInterface { /** * @var UserReflink */ protected $reflink; /** * @var string */ protected $message; /** * @param UserReflink $reflink */ public function __construct(UserReflink $reflink) { $this->reflink = $reflink; } /** * Сообщение, которое необходимо вывести пользователю в случае успеха * * @return string */ public function getResponse() { return $this->message; } /** * Если в этом методе возвращается ссылка, то в случае успеха * пользователь будет перенаправлен по ней * * @return string */ public function getRedirectUrl() { return CMS::backendPath(); } /** * Метод вызываемый в моменз перехода по ссылке */ public function handle() { // Объект пользователя, для которого ссылка была сгенерированна $user = $this->reflink->user; // Массив параметров переданных при генерации ссылки $parameters = $this->reflink->parameters; ... // Подтверждение регистрации ... // Отправляем пользователю сообщение об успешном подверждении регистрации Bus::dispatch(new EmailSend('user_registered', [ 'username' => $reflink->user->username, 'email' => $this->reflink->user->email ])); } }
use Reflinks; use KodiCMS\Users\Reflinks\Generators\UserRegisterGenerator; class User { // Регистрация пользователя public function postRegister() { ... $user = ...; $response = Reflinks::generateToken(new UserRegisterGenerator($user)); switch ($response) { case Reflinks::TOKEN_GENERATED: return back()->with('status', 'Вам на почту отправлено письмо с подтверждением'); default: return redirect()->back() ->withInput($this->request->al()) ->withErrors([$response]); } } }
Пользователю на почту приходит письмо с ссылкой http://site.com/reflink/32jh342j3h4bj23hb4234nj234nj23n4j
, а также токен 32jh342j3h4bj23hb4234nj234nj23n4j
, который он может ввести на странице http://site.com/reflink/