PUT Method - Создать или обновить запись (upserting) - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу включить upserting для метода PUT для одной из моих конечных точек.Поэтому, где бы ни существовала запись, она будет обновляться, а если она не существует, она будет создана.Я использую Api-Platform с Symfony 4.2.

Кажется, что поведение по умолчанию для api-платформы вообще его не поддерживает - Когда я пытаюсь сделать запрос PUT с даннымион не создан до того, как я получу 404 Response.

Я следовал официальному руководству, рекомендовал способ использования пользовательских операций (код сущности ниже), но все же до попадания в пользовательскую службуЯ получаю 404 Response.

Есть ли возможность заставить это работать?Правильное отображение аннотаций, запись в конце сообщения.

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiResource;

/**
 * @ORM\Entity()
 * @ApiResource(
 *     collectionOperations={},
 *     itemOperations={
 *         "get",
 *         "special"={
 *             "method"="PUT",
 *             "path"="/dummys/{id}",
 *             "controller"=DummysController::class
 *         }
 *     }
 * )
 */
class Dummy
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }
}

Запрос + журнал:

curl -X PUT "http://localhost/api/v1/dummys/non-existing-id" -H "accept: application/ld+json" -H "Content-Type: application/json" -d "{ \"name\": \"string\"}"

request.INFO: Matched route "api_dummys_special_item". {"route":"api_dummys_special_item","route_parameters":{"_route":"api_dummys_special_item","_controller":"App\\Controller\\DummyController","_format":null,"_api_resource_class":"App\\Entity\\Dummy","_api_item_operation_name":"special","id":"non-existing-id"},"request_uri":"http://localhost/api/v1/dummys/non-existing-id","method":"PUT"} []"
doctrine.DEBUG: SELECT (...) WHERE p0_.id = ? ["non-existing-id"] []"
request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "Not Found" at /app/vendor/api-platform/core/src/EventListener/ReadListener.php line 108 {"exception":"[object] (Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException(code: 0): Not Found at /app/vendor/api-platform/core/src/EventListener/ReadListener.php:108)"} []"

1 Ответ

0 голосов
/ 06 декабря 2018

Вы пробовали ту часть документации, в которой говорится, как обойти автоматический поиск ?

В основном добавить параметр _api_receive:

/**
 * @ORM\Entity()
 * @ApiResource(
 *     collectionOperations={},
 *     itemOperations={
 *         "get",
 *         "special"={
 *             "method"="PUT",
 *             "path"="/dummys/{id}",
 *             "controller"=DummysController::class,
 *             "defaults"={"_api_receive"=false}     <---- add this
 *         }
 *     }
 * )
 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...