#symfony #jwt #api-platform.com
#symfony #jwt #api-platform.com
Вопрос:
Доброе утро всем, пожалуйста, мне нужна помощь. Я использую аутентификацию JWT, и все работает хорошо.Но моя проблема заключается в том, чтобы вернуть текущего пользователя после входа в систему. Я видел в документации, что я могу создать контроллер для этого, но после этого я получаю ошибку параметра id, который не указан. Вот мой контроллер, связанный с объектом user
// api/src/Controller/GetMeAction.php
namespace AppController;
use AppEntityUser;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentSecurityCoreSecurity;
class GetMeAction
{
/**
* @param Security
*/
private $_security;
public function __construct(Security $security)
{
$this->_security = $security;
}
/**
* @Route(
* name="get_me",
* path="get/me",
* methods={"GET"},
* defaults={
* "_api_resource_class"=User::class,
* "_api_item_operation_name"="get_me"
* }
* )
*/
public function __invoke(Request $request): User
{
return $this->_security->getUser();
}
}
Комментарии:
1. измените
_api_item_operation_name
на_api_collection_operation_name
.2. это решит проблему . Спасибо yivi
Ответ №1:
Предыдущий ответ правильный, но вы забыли расширить свой контроллер из абстрактного:
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
class AdminController extends AbstractController
{
}
Если вы хотите получить пользователя в службе, вы можете ввести SymfonyComponentSecurityCoreAuthenticationTokenStorageTokenStorageInterface в свой __construct()
и вы можете получить от пользователя лайк:
public function getUser(): ?User
{
$token = $this->tokenStorage->getToken();
if (!$token) {
return null;
}
$user = $token->getUser();
if (!$user instanceof User) {
return null;
}
return $user;
}
Ответ №2:
Я использую symfony 5.3, я хотел использовать нормализацию платформы api и операцию элемента «get», чтобы сохранить всю пользовательскую конфигурацию, безопасность, сервисы… Поэтому я использовал forward()
метод в контроллере :
/**
* @Route("/api/user/me", name="get_me")
*/
public function getMe(): Response
{
$router = $this->get('router')->getRouteCollection()->get('api_users_get_item');
$defaults = $router->getDefaults();
return $this->forward($router->getDefault('_controller'), array_merge($defaults, [ 'id' => $this->getUser()->getId()]));
}