Пользовательская операция платформы API с пользовательским параметром

#rest #api #symfony #api-platform.com

#rest #API #symfony #api-platform.com

Вопрос:

Я только начал использовать платформу api dunglas. Я использую версию v2.0.0-rc1 и добавил пользовательскую операцию для включения / отключения пользователя.

Это мое пользовательское действие для пользователя

 <?php

namespace ZoefUserBundleAction;

use ZoefUserBundleEntityUser;
use DoctrineCommonPersistenceManagerRegistry;
use SensioBundleFrameworkExtraBundleConfigurationMethod;
use SymfonyComponentRoutingAnnotationRoute;

class UserAction
{
    /**
     * @Route(
     *     name="enabled_user",
     *     path="/users/{id}/enabled",
     *     defaults={"_api_resource_class"=User::class, "_api_item_operation_name"="enabled"}
     * )
     * @Method("PUT")
     */
    public function __invoke(User $user)
    {
        if($user->isEnabled()) {
            $user->setEnabled(false);
        } else {
            $user->setEnabled(true);
        }

        return $user;
    }
}
  

Когда я захожу в свои документы, пользовательская операция добавляется и работает, но для использования этого действия мне нужно отправить 4 параметра: email, полное имя, имя пользователя, включено. но я хочу отправить только включенный параметр, а идентификатор пользователя указан в маршруте, но я не могу найти в документе, как изменить параметры.

Может ли кто-нибудь помочь мне с этим?

Комментарии:

1. Вы получаете ошибку проверки? Можете ли вы опубликовать результат запроса PUT?

2. Вы нашли решение для этого?

Ответ №1:

Я пытался включить / отключить то же самое, и я сделал это таким образом:

Я создал пользовательский контроллер в AppBundleControllerAddressController

 use SymfonyBundleFrameworkBundleControllerController;

class AddressController extends Controller
{
    public function enableAction($data)
    {
        $data->setActive(true);

        $em = $this->getDoctrine()->getManager();
        $em->persist($data);
        $em->flush();

        return $data;
    }
}
  

В routing.yml моем:

 address_enable:
    path:     '/addresses/{id}/enable'
    methods:  ['PUT']
    defaults:
            _controller: 'AppBundle:Address:enable'
            _api_resource_class: 'AppBundleEntityAddress'
            _api_item_operation_name: 'enable'
  

В моей сущности у меня есть:

  * @ApiResource(
 *     itemOperations={
 *          "enable"={"route_name"="address_enable"},
 *     }
 * )
  

И после этого я просто отправляю его, поскольку URL/addresses/123/enable нет необходимости отправлять дополнительные параметры, только идентификатор.

Комментарии:

1. Этот метод не рекомендуется ApiPlatform ( api-platform.com/docs/core/controllers/#alternative-method )