Skip to content

Сервисные ссылки

butschster edited this page Jun 24, 2015 · 1 revision

Генерация сервисных ссылок

Иногда возникает необходимость сделать какие либо действия над пользователем. Например после регистрации пользователя выслать ему ссылку подтверждения или ссылку восстановления пароля. Для таких целей используется класс 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/