-
Notifications
You must be signed in to change notification settings - Fork 1
2. Создаем свои контроллеры
Именно эту проблему нужно поднять перед разработкой контроллеров.
На GreenWix пользователь может отправлять монеты своим друзьям, получать свою статистику по мини-играм, и так много чего. Поэтому у нас есть FriendsController, MoneyController, и так далее. По названиям сразу видно, что в этом контроллере есть. Вот часть наших контроллеров:
Пусть пользователь должен уметь отправлять другим пользователям сообщения. Значит будет 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
];
}
}
Когда Вы сделаете все контроллеры, можно будет потестировать.