Skip to content

Latest commit

 

History

History
240 lines (204 loc) · 5.07 KB

File metadata and controls

240 lines (204 loc) · 5.07 KB

Get started

Create your model or entity, with serialize groups and validator

<?php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Attribute\Groups;
use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity]
class Book {

	#[ORM\Column(type: "integer")]
	#[ORM\Id]
	#[ORM\GeneratedValue]
	#[Groups(["book_get", "book_getc"])]
	private ?int $id = null;

	#[ORM\Column(type: "string")]
	#[Groups(["book_get", "book_getc", "book_post", "book_put", "book_patch_title"])]
	#[Assert\NotBlank(groups: ["book_post", "book_put", "book_patch_title"])]
	private string $title;

	#[ORM\Column(type: "string")]
	#[Groups(["book_get", "book_post", "book_put"])]
	#[Assert\Length(max: 512, groups: ["book_post", "book_put"])]
	#[Assert\NotBlank(groups: ["book_post", "book_put"])]
	private string $description;

	/////////////
	// Getters //
	/////////////

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

	public function getTitle(): string {
		return $this->title;
	}

	public function getDescription(): string {
		return $this->description;
	}

	/////////////
	// Setters //
	/////////////

	public function setTitle(string $title): self {
		$this->title = $title;
		return $this;
	}

	public function setDescription(string $description): self {
		$this->description = $description;
		return $this;
	}
}

Create your Api Controller

<?php
namespace App\Controller\Api;

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
use GollumSF\RestBundle\Attribute\Serialize;
use GollumSF\RestBundle\Attribute\Unserialize;
use GollumSF\RestBundle\Attribute\Validate;
use GollumSF\RestBundle\Search\ApiSearchInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

#[Route('/api/books')]
class BookController {

	#[Route('', methods: ['GET'])]
	#[Serialize(groups: 'book_getc')]
	public function list(ApiSearchInterface $apiSearch) {
		return $apiSearch->apiFindBy(Book::class);
	}

	#[Route('/{id}', methods: ['GET'])]
	#[Serialize(groups: 'book_get')]
	public function find(Book $book) {
		return $book;
	}

	#[Route('', methods: ['POST'])]
	#[Unserialize('book', groups: 'book_post')]
	#[Validate(['book_post'])]
	#[Serialize(groups: 'book_get', code: Response::HTTP_CREATED)]
	public function post(Book $book) {
		return $book;
	}

	#[Route('/{id}', methods: ['PUT'])]
	#[Unserialize('book', groups: 'book_put')]
	#[Validate(['book_put'])]
	#[Serialize(groups: 'book_get')]
	public function put(Book $book) {
		return $book;
	}

	#[Route('/{id}/title', methods: ['PATCH'])]
	#[Unserialize('book', groups: 'book_patch_title')]
	#[Serialize(groups: 'book_get')]
	public function patchTitle(Book $book) {
		return $book;
	}

	#[Route('/{id}', methods: ['DELETE'])]
	#[Serialize(groups: 'book_get')]
	public function delete(Book $book, EntityManagerInterface $em) {
		$em->remove($book);
		$em->flush();
		return $book;
	}
}

Request and Response

list action:

  • url: GET http://127.0.0.1/api/books
  • request:
    • query parameters: (example : GET http://127.0.0.1/api/books?limit=10&page1&order=title&directionp=desc)
      • limit (integer): Number returned items
      • page: (integer): Page of returned items into total
      • order (string): Name or property for sort
      • direction (asc or desc): Direction of sort
  • response:
    • body content:
{
	"total": 100,
	"data": [
		{ "id": 1, "title": "Dune" },
		{ "id": 2, "title": "Robots" },
		{ "id": 3, "title": "Game of Throne" },
		{ "id": 4, "title": "Harry Potters" }
	]
}

find action:

  • url: GET http://127.0.0.1/api/books/1
  • request: none
  • response:
    • body content:
{
	"id": 1,
	"title": "Dune",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}

post action:

  • url: POST http://127.0.0.1/api/books
  • request:
    • body content:
{
	"title": "Deus ex machina",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}
  • response:
    • body content:
{
	"id": 5,
	"title": "Deus ex machina",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}

put action:

  • url: PUT http://127.0.0.1/api/books/5
  • request:
    • body content:
{
	"title": "Deus ex machina - The Book",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}
  • response:
    • body content:
{
	"id": 5,
	"title": "Deus ex machina - The Book",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}

patchTitle action:

  • url: PATCH http://127.0.0.1/api/books/5/patch-title
  • request:
    • body content:
{
	"title": "Deus ex machina - The Book"
}
  • response:
    • body content:
{
	"id": 5,
	"title": "Deus ex machina - The Book",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}

delete action:

  • url: DELETE http://127.0.0.1/api/books/5
  • request: none
  • response:
    • body content:
{
	"id": null,
	"title": "Deus ex machina - The Book",
	"description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
}