首页 > 解决方案 > 如何从 api 平台返回自定义数据?

问题描述

我是 symfony 和 api 平台的初学者。我尝试实现一个允许返回自定义数据而不是 api 平台响应的解决方案。

我尝试自定义控制器HttpFoundation\Response但无法实现/管理它。

这是我的代码:

APP\Entity 中的 Task.php

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use App\Controller\TaskController;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ApiResource(itemOperations={
 *     "get",
 *     "post_publication"={
 *         "method"="POST",
 *         "path"="/tasks",
 *         "controller"=TaskController::class,
 *     "read"=false,
 *     }
 * })
 * @ORM\Entity(repositoryClass="App\Repository\TaskRepository")
 */
class Task
{
    /**
     * @Groups("tasks")
     */

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

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

    /**
     * @ORM\ManyToOne(targetEntity="User")
     */
    public  $user;

    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;
    }

    public function getTime(): ?string
    {
        return $this->time;
    }

    public function setTime(string $time): self
    {
        $this->time = $time;

        return $this;
    }

    public function getPriority(): ?string
    {
        return $this->priority;
    }

    public function setPriority(string $priority): self
    {
        $this->priority = $priority;

        return $this;
    }

    /**
     * @return mixed
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * @param mixed $user
     */
    public function setUser($user): void
    {
        $this->user = $user;
    }


}

App\Controller 中的 TaskController.php

<?php

namespace App\Controller;

use App\Entity\Task;
use Symfony\Component\HttpFoundation\Response;


class TaskController extends Task
{
    public function __construct()
    {
    }

    public function __invoke(Task $data): Task
    {

        $result["success"] = true;

        return $result;
    }
}

这是我在 api/tasks 上的 post 方法后得到的答案

{
    "@context": "\/api\/contexts\/Task",
    "@id": "\/api\/tasks\/17",
    "@type": "Task",
    "user": null,
    "id": 17,
    "name": "string",
    "time": "string",
    "priority": "string"
}

这是调用端点时我想返回的答案:

{“成功”:真,“消息”:“成功发送”}

我希望它很清楚,如果没有,请告诉我,提前谢谢

标签: symfonysymfony4api-platform.com

解决方案


由于 Api-platform 不是为此类事情设计的,因此您必须通过隐式添加资源定义作为请求属性来欺骗它:

    /**
     * @Route(
     *     name="task",
     *     path="/task",
     *     methods={"POST","OPTIONS"},
     *     defaults={
     *          "_api_resource_class"=Task::class,
     *          "_api_collection_operation_name"="post"
     *     }
     * )
     * @param Task $data
     * @return JsonResponse
     */
    public function __invoke(Task $data): JsonResponse {
        return new JsonResponse('task success json', 201);
    }

推荐阅读