Implementing a RESTful API for a todo service with PHP Symfony

Matheus Shikomba
3 min readMar 27, 2023

--

Rest API with PHP Symfony

Introduction

A RESTful API is an essential component of most modern web applications. It allows clients to interact with the server using HTTP methods such as GET, POST, PUT, and DELETE. In this tutorial, we will learn how to create a RESTful API for a todo service using PHP Symfony.

Requirements

Before we begin, make sure you have the following:

  • PHP 7.4 or later
  • Symfony 5.4 or later
  • Composer

Step 1: Setup

First, we need to create a new Symfony project. Open your terminal or command prompt and run the following command:

composer create-project symfony/skeleton todo-service

This will create a new Symfony project in a directory called todo-service. Change your current directory to todo-service using the following command:

cd todo-service

Step 2: Install Dependencies

Next, we need to install some dependencies that will help us to build our RESTful API. We will use the MakerBundle to generate some boilerplate code and the DoctrineBundle to interact with the database. Run the following command to install these packages:

composer require symfony/maker-bundle doctrine maker-bundle orm-pack

Step 3: Create Database Table

Our todo service will store todo items in a database table. Let’s create a table to store these items. We will use Doctrine’s ORM (Object Relational Mapping) to interact with the database.

First, create a new database for our project. Open your MySQL command prompt or any other database client of your choice and run the following command:

CREATE DATABASE todo_service;

Next, create a new file called .env in the root directory of your project and add the following configuration:

DATABASE_URL=mysql://user:password@127.0.0.1:3306/todo_service

Replace user and password with your MySQL username and password.

Now, run the following command to create a new entity called Todo:

bin/console make:entity Todo

This command will ask you to provide some information about the entity such as the name of the table, the name of the columns, and their types. Add the following fields id, title, description, dueDate, and completed. After you have provided this information, the Todo entity class will be created in the src/Entity directory.

Now, run the following command to create the database table:

bin/console doctrine:schema:create

This command will create a new table called todo in the database.

Step 4: Create Controller

Next, we need to create a controller that will handle the HTTP requests for our todo service. Run the following command to create a new controller called TodoController:

bin/console make:controller TodoController

This command will create a new controller class in the src/Controller directory. Open this file and add the following code:

use App\Entity\Todo;
use App\Form\TodoType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
* @Route("/api/todos")
*/
class TodoController extends AbstractController
{
/**
* @Route("/", name="todo_index", methods={"GET"})
*/
public function index(): Response
{
$todos = $this->getDoctrine()
->getRepository(Todo::class)
->findAll();

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

/**
* @Route("/{id}", name="todo_show", methods={"GET"})
*/
public function show(Todo $todo): Response
{
return $this->json($todo);
}

/**
* @Route("/", name="todo_create", methods={"POST"})
*/
public function create(Request $request): Response
{
$todo = new Todo();
$form = $this->createForm(TodoType::class, $todo);
$form->submit($request->request->all());

if ($form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($todo);
$entityManager->flush();

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

return $this->json($form->getErrors(), 400);
}

/**
* @Route("/{id}", name="todo_update", methods={"PUT"})
*/
public function update(Request $request, Todo $todo): Response
{
$form = $this->createForm(TodoType::class, $todo);
$form->submit($request->request->all());

if ($form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($todo);
$entityManager->flush();

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

return $this->json($form->getErrors(), 400);
}

/**
* @Route("/{id}", name="todo_delete", methods={"DELETE"})
*/
public function update(Request $request, Todo $todo): Response
{
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($todo);
$entityManager->flush();

return $this->json(null, 204);
}

With this implementation, you should be able to test this API with insomnia or POSTMAN.

Step 6: Start the development server

Finally, you can start the Symfony development server using the following command:

php bin/console server:run

This will start the development server, and you can access your Todo API at http://localhost:8000/api/todos.

#Symfony #PHP #RESTful #API

--

--

Matheus Shikomba

Let's Talk about AWS, Laravel, API Development and Data Science