如何在API平台中创建自定义端点并将其添加到文档中?

时间:2017-07-05 12:51:16

标签: php rest symfony api-platform.com

我想创建未映射的实体端点,如/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文档中?

3 个答案:

答案 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