我想创建未映射的实体端点,如/api/v1/me
,它返回有关当前经过身份验证的用户的信息(User
对象),并将其添加到我的文档中。在计划中,我还想添加/api/v1/account/recover
和/api/v1/account/verify-email
等终端。
我有一个动作:
namespace AppBundle\Action\Me;
use AppBundle\Entity\User;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class MeView
{
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
/**
* @Security("is_authenticated()")
*
* @Route(
* name="me_view",
* path="/me",
* methods={"GET"}
* )
*
* @return User
*/
public function __invoke()
{
return $this->tokenStorage->getToken()->getUser();
}
}
但是当我尝试访问它时,它会返回一个异常:
控制器必须返回响应(给定对象(AppBundle \ Entity \ User))。 (500内部服务器错误)
相同的操作,但与实体映射,效果很好:
namespace AppBundle\Action\City;
use AppBundle\Entity\City;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Routing\Annotation\Route;
class CityView
{
/**
* @Security("is_authenticated()")
*
* @Route(
* name="city_view",
* path="/cities/{id}",
* methods={"GET"},
* defaults={"_api_resource_class"=City::class, "_api_item_operation_name"="view"}
* )
*
* @param City $city
* @return City
*/
public function __invoke(City $city)
{
return $city;
}
}
如何使自定义操作正常工作以及如何将其添加到自动生成的Swagger文档中?
答案 0 :(得分:2)
你应该看一下这个帖子,有人为我/我的自定义动作提供了一个实现。 https://github.com/api-platform/api-platform/issues/337
希望它会对你有所帮助:)。
答案 1 :(得分:2)
控制器:
class MyUserController extends Controller
{
public function fn_me()
{
return $this->getUser();
}
}
实体:
* @ApiResource(
* collectionOperations={
* "get","post",
* "collName_api_me"={"route_name"="api_me"}
* }
* )
*/
class User implements UserInterface, \Serializable
routes.yaml
api_me:
path: '/api/me'
methods: ['GET']
defaults:
_controller: '\App\Controller\MyUserController::fn_me'
_api_resource_class: 'App\Entity\User'
_api_collection_operation_name: 'collName_api_me'
答案 2 :(得分:0)
首先让它工作,并且没有链接到您需要返回JsonResponse
的实体。
也许你可以这样:https://github.com/api-platform/api-platform/issues/246#issuecomment-287638334