Обновление нежелательного поля api-платформы при пользовательской операции - PullRequest
0 голосов
/ 19 февраля 2019

Существует приложение с API-платформой поверх Symfony 4. Я создал пользовательскую операцию , как рекомендовано .

Сущность

 * @Api\ApiResource(
 *     normalizationContext={"groups"={"read_importation_demand"}},
 *     denormalizationContext={"groups"={"write_importation_demand"}},
 *     itemOperations={
 *     "get",
 *     "put",
 *     "delete",
 *     "workflow"={
 *         "method"="POST",
 *         "path"="/importation_demands/{id}/workflow",
 *
 *         "controller"=ImportationWorkflowController::class,
 *     }
 * })

Контроллер

public function __invoke(ImportationDemand $data, Request $request): ImportationDemand
{
    $requestData = json_decode($request->getContent(), true);
    $request->request->replace($requestData);
    $workflow = $this->workflowsRegistry->get($data, 'presentacion_oferta');
    $transicion = $request->get('transition');
    $workflow->apply($data, constant("App\Enum\ImportationDemandWorkflowEnum::$transicion"));
    $this->manager->flush();

    return $data;
}

Я получаю описаниеи параметры перехода для установки в сущности workflow .Проблема в том, что когда я выполняю сброс в базу данных, атрибут описания в ImportedDemand устанавливается со значением полученного поля описания.Он может быть установлен только в сущности ImportedDemandWorkflow, но устанавливается в обоих.Как видно из кода, я никогда не устанавливал поле описания ImportedDemand.

Прослушиватель событий перехода

public function onWorkflowPresentacionOfertaEntered(WorkflowEvent $event)
    {
        $request = $this->container->get('request_stack')->getCurrentRequest();
        $username = $this->container->get('security.token_storage')->getToken()->getUsername();
        $user = $this->manager->getRepository(User::class)->loadUserByUsername($username);
        /** @var ImportationDemand $solicitud */
        $solicitud = $event->getSubject();
        $workflow = new ImportationDemandWorkflow();
        $workflow->setStatus($solicitud->getStatus())
            ->setDescription($request->get('description', 'No se introdujo una descripción para esta operación'))
            ->setAction($event->getTransition()->getName())
            ->setDoneAt(new \DateTime())
            ->setPerformer($user);
        $solicitud->addWorkflow($workflow);
    }

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

Почему api-платформа обновляет поле описания, если я, как утверждается, контролирую выполненную операцию?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...