Skip to content

1. Определяем нужные типы

Aydan Minnegaraev edited this page Feb 16, 2022 · 1 revision

Создаем класс пользователя

Везде существует либо класс User, либо Player. В нем есть методы для работы с пользователем (например отправки ему сообщения).

В нашем случае создадим класс User:

class User{

}

Пусть нашему пользователю добавим возможность отправить сообщение, а также заставим его хранить свой никнейм:

class User{

	public $nickname;

	private function __construct(string $nickname){
		$this->nickname = $nickname;
	}

	public function send(string $message, string $nickname): string{
		return 'sent ' . $message . ' from ' . $this->nickname . ' to ' . $nickname;
	}

}

Почему приватный конструктор? Потому что у API будет 2 возможности получить объект пользователя, а именно при помощи токена или никнейма:

class User{

	public $nickname;

	private function __construct(string $nickname){
		$this->nickname = $nickname;
	}

	public static function fromNickname(string $nickname): User{
		return new User($nickname);
	}

	public static function fromToken(string $token): User{
		return new User('someUser');
	}

	public function send(string $message, string $nickname): string{
		return 'sent ' . $message . ' from ' . $this->nickname . ' to ' . $nickname;
	}

}

Готово! Теперь перейдем непосредственно к созданию типов.

Создавая свой тип вы создаете 2 класса - валидатор и саму структуру данных.

Валидатор осуществляет проверку входных данных и создает экземпляр структуры данных.

Структура данных - содержит уже проверенные входные данные и является возможным типом аргумента в методе контроллера.

Давайте создадим класс UserToken (структуру данных).

class UserToken
{

	protected $token;

	public function __construct(string $token) {
		$this->token = $token;
	}

	public function user(): User{
		return User::fromToken($this->token);
	}

}

По сути он просто хранит токен в виде строки и имеет функцию получения объекта пользователя по этому токену.

Давайте создадим класс валидатора с названием UserTokenValidator.

class UserTokenValidator extends TypeValidator {

    // какой объект будет создаваться этим контроллером
	public function getFullTypeName(): string {
		return UserToken::class;
	}

	// создавать ли тип UserToken[] (массив) для использования в методах контроллеров
	public function createAlsoArrayType(): bool { 
		return false;
	}

	/**
	 * @throws RuntimeErrorException
	 */
	public function validateAndGetValue(string $input, array $extraData): UserToken {
		$isTokenValid = $input === "some_token"; // проверка токена на валидность

		if(!$isTokenValid){
			throw RuntimeError::BAD_VALIDATION_RESULT("Wrong token");
		}

		return new UserToken($input);
	}
}

Готово! Теперь пора делать контроллеры