Платформа API и пользовательская операция POST с собственным телом - PullRequest
0 голосов
/ 20 февраля 2019

Надеюсь, я прав, спросив это.Я рассмотрел (почти) все подобные проблемы, но я еще не удовлетворен.

Я работаю над сущностью пользователя и уже несколько дней (даже недель) пытаюсь отправить пользователя с помощьюиндивидуальное тело.Вот часть моей сущности Пользователь:

/**
 * @ApiResource(
 *      normalizationContext={"groups"={"read"}},
 *      denormalizationContext={"groups"={"write"}},
 *      itemOperations={
 *          "get",
 *          "put",
 *          "delete",
 *          "get_active_user"={
 *              "method"="GET",
 *              "path"="/users/active/me",
 *              "controller"=UserReadAction::class,
 *              "defaults"={"_api_receive"=false},
 *              "swagger_context"={
 *                  "parameters"={
 *
 *                  }
 *              }
 *          },
 *      },
 *      collectionOperations={
 *          "change_password"={
 *              "method"="POST",
 *              "path"="/users/active/changepassword",
 *              "controller"=UserChangePasswordAction::class,
 *              "normalization_context"={"groups"={"afup"}},
 *              "defaults"={"_api_receive"=false},
 *              "swagger_context"={
 *                  "summary" = "Change user password",
 *                  "parameters"={
 *                      {
 *                          "name" = "User",
 *                          "in" = "body",
 *                          "schema" = {
 *                              "type" = "object",
 *                              "properties" = {
 *                                  "password" = {"type"="string"},
 *                                  "nom" = {"type"="string"},
 *                              }
 *                           },
 *                          "required" = "true",
 *                      }
 *                  },
 *              }
 *          }
 *      }
 * )
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups({"read", "write", "afup"})
     */
    private $id;

Вот контроллер:

namespace App\Controller\SDK;


use App\Entity\User;
use App\Service\SDK\UserService;
use Symfony\Component\Security\Core\Security;

class UserChangePasswordAction
{
    public function __invoke(User $data)
    {
        var_dump($data);die;
    }
}

И файл services.yaml (некоторая часть)

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller/*'
        tags: ['controller.service_arguments']

Когда я пытаюсь это сделать (см. Var_dump в контроллере), я получаю сообщение об ошибке:

Невозможно автоматически передать аргумент $ data для "App \ Controller \ SDK \ UserChangePasswordAction ()": он ссылается на класс "App \Entity \ User "такой службы не существует

Я прочитал официальный документ, и кажется, что метод _invoke должен автоматически получить объект.Но это не работает для меня.

Примечание: я также определил пользовательскую операцию элемента "get_active_user", и она отлично работает.

Пожалуйста, я хотел бы понять:

  • что я сделал не так,
  • как это на самом деле работает,

Спасибо.

РЕДАКТИРОВАТЬ: В определении collectionOperation я удалил следующую настройку, котораяозначает, что мы вручную хотим обработать извлечение данных (пользователя):

  • "defaults" = {"_ api_receive" = false},

сейчасконтроллер возвращает пустую сущность пользователя, а не ошибку.Я все еще не могу получить отправленные данные.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Редактирование моего вопроса исправляет проблему.На самом деле, мне просто нужно было удалить эту аннотацию из определения операции POST: ')

"defaults" = {"_ api_receive" = false},

Теперь, когдаЯ отправляю данные, я получаю их как на следующем изображении: enter image description here

Эта аннотация важна, когда вы пишете пользовательскую операцию GET.

0 голосов
/ 20 февраля 2019

Это не работает, потому что это CollectionOperation.В этом случае вы можете получить пользователя через TokenStorageInterface

namespace App\Controller\SDK;


use App\Entity\User;
use App\Service\SDK\UserService;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

class UserChangePasswordAction
{
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function __invoke(Request $request) //Get request if you want o keep args empty
    {

        var_dump($this->tokenStorage->getToken()->getUser());die;
    }
}
...