-
Notifications
You must be signed in to change notification settings - Fork 1
1. Определяем нужные типы
Везде существует либо класс 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);
}
}
Готово! Теперь пора делать контроллеры