Skip to content

2. Создаем свои контроллеры

Aydan Minnegaraev edited this page Feb 16, 2022 · 4 revisions

Что должен уметь пользователь?

Именно эту проблему нужно поднять перед разработкой контроллеров.

На GreenWix пользователь может отправлять монеты своим друзьям, получать свою статистику по мини-играм, и так много чего. Поэтому у нас есть FriendsController, MoneyController, и так далее. По названиям сразу видно, что в этом контроллере есть. Вот часть наших контроллеров:

контроллеры GreenWix

Я определился с тем, что должен уметь пользователь

Пусть пользователь должен уметь отправлять другим пользователям сообщения. Значит будет MessagesController:

<?php

namespace example\controller;

use example\user\UserNickname;
use example\user\UserToken;
use GreenWix\prismaFrame\controller\Controller;

class MessagesController extends Controller{ // каждый контроллер должен наследовать класс Controller

	public function getName(): string{
		return "messages"; // имя контроллера
	}

	/**
	 * Отправка сообщения одному пользователю
	 *
	 * @httpMethod GET 
	 *
	 * @param UserToken $token
	 * @param UserNickname $target
	 * @param string $message
	 * @return array
	 */
	public function sendMessage(UserToken $token, UserNickname $target, string $message): array{
		$user = $token->user(); // получаем нашего пользователя
		$nickname = $target->user()->nickname; // получаем никнейм получателя сообщения

		return [
			"data" => $user->send($message, $nickname)
			];
	}

}

Вот где используются поддерживаемые типы. Их можно использовать в качестве типа аргумента. Они хороши тем, что Вам не понадобится постоянно валидировать входящий токен, никнеймы, и так далее. Вы это уже сделали внутри поддерживаемого типа, и теперь Вам остается использовать все готовое.

Каждый метод должен...

...иметь php-doc. Нужен он для того, чтобы указать в нем, какой HTTP метод можно принять. Для этого есть "атрибут" @httpMethod (настоящие атрибуты введут в php 8). Он может принимать значения GET POST PATCH PUT. Если хочется принимать сразу несколько, Вы можете указать так:

@httpMethod GET|POST

Применяем массивы поддерживаемых типов

Во всех поддерживаемых типах есть метод isArrayType(). Сейчас станет понятнее для чего он.

Предположим, сообщение можно отправить не одному игроку, а сразу нескольким. Это как с API ВКонтакте, где можно в messages.send указать user_ids и отправить сразу нескольким пользователям сообщение.

Давайте сделаем для этого отдельный метод sendMessageForUsers:

/**
 * Отправка сообщения нескольким пользователям
 *
 * @httpMethod GET 
 *
 * @param UserToken $token
 * @param UserNickname[] $targets Обратите внимание на []
 * @param string $message
 * @return array
 */
public function sendMessageForUsers(UserToken $token, array $targets, string $message): array{
	$user = $token->user(); // получаем нашего пользователя (отправителя)
	$data = [];

	foreach($targets as $target){
		$nickname = $target->user()->nickname; // получаем никнейм получателя сообщения
		$data[$nickname] = $user->send($message, $nickname);
	}

	return [
		"data" => $data
		];
}

Итог

<?php

namespace example\controller;

use example\user\UserNickname;
use example\user\UserToken;
use GreenWix\prismaFrame\controller\Controller;

class MessagesController extends Controller{ // каждый контроллер должен наследовать класс Controller

	public function getName(): string{
		return "messages"; // имя контроллера
	}

	/**
	 * Отправка сообщения одному пользователю
	 *
	 * @httpMethod GET 
	 *
	 * @param UserToken $token
	 * @param UserNickname $target
	 * @param string $message
	 * @return array
	 */
	public function sendMessage(UserToken $token, UserNickname $target, string $message): array{
		$user = $token->user(); // получаем нашего пользователя (отправителя)
		$nickname = $target->user()->nickname; // получаем никнейм получателя сообщения

		return [
			"data" => $user->send($message, $nickname)
			];
	}


	/**
	 * Отправка сообщения нескольким пользователям
	 *
	 * @httpMethod GET 
	 *
	 * @param UserToken $token
	 * @param UserNickname[] $targets Обратите внимание на []
	 * @param string $message
	 * @return array
	 */
	public function sendMessageForUsers(UserToken $token, array $targets, string $message): array{
		$user = $token->user(); // получаем нашего пользователя (отправителя)
		$data = [];

		foreach($targets as $target){
			$nickname = $target->user()->nickname; // получаем никнейм получателя сообщения
			$data[$nickname] = $user->send($message, $nickname);
		}

		return [
			"data" => $data
			];
	}

}

Когда Вы сделаете все контроллеры, можно будет потестировать.