Как использовать конвертер параметров fosrest для обновления объекта, связанного с другим объектом - PullRequest
0 голосов
/ 23 января 2019

Я работаю над API отдыха, который использует FOSRestBundle и Symfony 4. У меня проблема с моими пользовательскими преобразователями параметров.

Для создания и обновления существует 2 пользовательских преобразователя параметров.Обновление Param Converter расширяет возможности создания Param Converter.У меня проблема с получением объекта должным образом.возвращаемый объект не имеет идентификатора, также любые другие связанные объекты (manyToOne или OneToOne) не преобразуются автоматически в нужный объект.

Это контроллер

/**
 * @Post("/properties")
 * @ParamConverter("property", converter="create_entity_from_request_body")
 *
 * @param Property $property
 * @param PropertyManager $propertyManager
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function create(Property $property, PropertyManager $propertyManager)
{
    $propertyManager->createProperty($property);
    $location = $this->generateUrl('app_property_show', ['id' => $property->getId()]);

    return $this->json($property, Response::HTTP_CREATED, ['Location' => $location]);
}

/**
 * @Patch("/properties/{id}")
 * @ParamConverter("property", converter="update_entity_from_request_body",
 *     options={"mapping": {"id": "id"}})
 *
 * @param Property $property
 * @param PropertyManager $propertyManager
 * @return \Symfony\Component\HttpFoundation\JsonResponse
 */
public function update(Property $property, PropertyManager $propertyManager)
{
    $propertyManager->updateProperty($property);

    return $this->json($property);
}

Это метод и конструктор применения преобразователя параметров создания

 public function __construct(
    FOSRequestBodyParamConverter $requestBodyParamConverter,
    string $validationErrorsArgument = null
) {
    $this->requestBodyParamConverter = $requestBodyParamConverter;
    $this->validationErrorsArgument = $validationErrorsArgument;
}

/**
 * @param Request $request
 * @param ParamConverter $configuration
 * @return bool
 */
public function apply(Request $request, ParamConverter $configuration)
{
    $this->requestBodyParamConverter->apply($request, $configuration);

    if ($this->validationErrorsArgument) {
        $validationErrors = $request->attributes->get($this->validationErrorsArgument);

        if (count($validationErrors) > 0) {
            throw new ValidationException($validationErrors);
        }
    }
}

это преобразователь параметров обновления, который в основном расширяет возможности создания.one

public function __construct(
    DoctrineParamConverter $doctrineParamConverter,
    FOSRequestBodyParamConverter $requestBodyParamConverter,
    string $validationErrorsArgument = null
) {
    parent::__construct($requestBodyParamConverter, $validationErrorsArgument);

    $this->doctrineParamConverter = $doctrineParamConverter;
}

/**
 * @param Request $request
 * @param ParamConverter $configuration
 * @return bool|void
 */
public function apply(Request $request, ParamConverter $configuration)
{
    //$this->doctrineParamConverter->apply($request, $configuration);

    $options = $configuration->getOptions() + [
            'deserializationContext' => [
                'object_to_populate' => $request->attributes->get($configuration->getName()),
            ],
            'validator' => [
                'groups' => ['update'],
            ]
        ];

    $configuration->setOptions($options);

    parent::apply($request, $configuration);
}

Здесь у меня есть сущность основного объекта, которая связана с объектом Image с отношением OneToOne

/**
 * @ORM\Column(type="string", length=200)
 */
private $name;

/**
 * @ORM\OneToOne(targetEntity="App\Model\Entity\Image")
 */
private $logo;

Это то, что я отправляю в качестве запроса исправления для контроллера: (тамэто изображение в БД с ID = 1)

{
"name": "crap home",
"logo": "1"
}

Это то, что я вижу, когда выкидываю объект свойства, который вводится в контроллер

object(App\Model\Entity\Property)[385]
  private 'id' => null
  private 'name' => string 'crap home' (length=10)
  private 'logo' => null
...