API Platform – is it worth it?

Is it possible to build a functional REST (Representational State Transfer) application within a couple of minutes? Read our article and find out how you can do it.

Introduction

API Platform was launched in 2015 by the Symfony expert – Kevin Douglas. The framework has been released at the SymfonyCon in Paris and shocked the community turning out to be one of the most important software premieres alongside Platform.sh and Blackfire.io.

API Platform has been built using PHP and Symfony framework. During the new REST project development, we have to put a lot of work into the entire process – especially at the beginning. API Platform has been created to make it easier and quicker.

Getting started

API Platform installation process is very simple. You just need to run the command ‘composer require api’ in your current project. After framework installation, enter the link: 127.0.0.1:8000/api, and then the welcome panel should appear. This panel allows you to display all current endpoints with the ability to test them and generate their documentation using ReDoc.

Implementation

Adding an entity

At the beginning, let’s create a new user account and add the fields shown below.

  • src/Entity/User.php

class User implements UserInterface, UserApiInterface
{
    /** @var int */
    private $id;

    /** @var string */
    private $name;

    /** @var string */
    private $email;

    /** @var string */
    private $password;

To ensure that our user is not lonely, let’s add posts in relation to many-to-one. Our post should have fields like the example below. 

  • src/Entity/Post.php

<?php

declare(strict_types=1);

namespace AppEntity;class Post implements PostInterface
{
    /** @var int */
    private $id;

    /** @var string */
    private $description;

    /** @var DateTime */
    private $dateTime;

    /** @var UserApiInterface */
    private $userPost;

API Integration

After adding a user account and posts, let’s create its API Platform implementation. At first, indicate where the configuration will be stored.

  • config/packages/api_platform.yaml
mapping:
paths:
       - '%kernel.project_dir%/config/api_platform'

Add two files with a simple configuration.

  • config/api_platform/user.api.yml

AppEntityUser:

  • config/api_platform/post.api.yml

AppEntityPost:

Then, refresh the page 127.0.0.1:8000/api, and the first CRUD application with all endpoints should appear. It is so simple, isn’t it?

Now we can check what new routes have appeared in the console.

php bin/console debug:router

Database

Another step is to configure the MySQL database. Insert into the env.local file parameters such as user name, password, and at the end name of the database.

DATABASE_URL=mysql://root:[email protected]:3306/api_platform

We run two commands in the terminal in turn.

php bin/console doctrine:migrations:diff

php bin/console doctrine:migrations:migrate

Afterward, we got a complete database with the user and post table. Now install the orm-fixtures in order to generate the required testing data. Then, run a command:

composer require orm-fixtures --dev

Add a user’s test data.

  • src/DataFixtures/ApiFixtures.php

class ApiFixtures extends Fixture
{
    private $passwordEncoder;

    public function __construct(UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->passwordEncoder = $passwordEncoder;
    }

    public function load(ObjectManager $manager)
    {
        $this->loadUsers($manager);
        $this->loadPosts($manager);
    }

    public function loadUsers(ObjectManager $manager)
    {
        $user = new User();
        $user->setEmail('[email protected]');
        $user->setName('test');
        $user->setPassword($this->passwordEncoder->encodePassword(
            $user,
            'secret'
        ));
        $manager->persist($user);
        $manager->flush();
    }

    public function loadPosts(ObjectManager $manager)
    {
        $userRepository = $manager->getRepository(User::class);
        $user = $userRepository->findOneBy(['name' => 'test']);
        $post = new Post();
        $post->setDateTime(new DateTime('now'));
        $post->setDescription('Some description');
        $post->setUserPost($user);
        $manager->persist($post);
        $manager->flush();
    }
}

Then, run a command in the terminal to save data in a database.

php bin/console doctrine:fixtures:load

At this step, we have to test our endpoints. To this end, enter the link: 127.0.0.1:8000/api in your browser. In this case, we will download all posts.