In this post we are going to create RESTfull APIs using PHP framework Symfony 3. This will be exemplified on a “Car” entity.
1. Creating Symfony Application
First make sure you have composer globally installed and then run the next command that will install the latest version of Symfony:
composer create-project symfony/framework-standard-edition my_project
2. Bundles configuration
To implement the web services you will need the following 3 bundles: JMSSerializerBundle, FOSRestBundle, NelmioApiDocBundle. Run the commands from below:
composer require jms/serializer-bundle
composer require friendsofsymfony/rest-bundle
composer require nelmio/api-doc-bundle
After installing them using composer, the 3 bundles must be included in AppKernel.php.
public function registerBundles()
{
$bundles = array(
// ...
new Nelmio\ApiDocBundle\NelmioApiDocBundle(),
new JMS\SerializerBundle\JMSSerializerBundle(),
new FOS\RestBundle\FOSRestBundle(),
);
// ...
}
The next thing to do is register the route for the NelmioBundle in app/config/routing.yml.
NelmioApiDocBundle:
resource: "@NelmioApiDocBundle/Resources/config/routing.yml"
prefix: /api
Now the bundles configurations must be enabled in app/config/config.yml.
nelmio_api_doc:
sandbox:
accept_type: "application/json"
body_format:
default_format: "json"
fos_rest:
param_fetcher_listener: true
body_listener: true
routing_loader:
default_format: json
include_format: false
view:
view_response_listener: true
This configuration is for minimal usage. For more options,please visit the following websites: FOSRestBundle and NelmioApiDocBundle
3. Creating new bundle (CarBundle)
To create a bundle run the next command and follow the installation steps:
php app/console generate:bundle.
As we said this tutorial is based on a “Car” entity. So we need a class “Car” in Entity folder.
namespace CarBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table(name="cars")
* @ORM\Entity
*/
class Car
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=35)
*/
private $brand;
}
As you can see, Doctrine is used to map the Entitiy to the car table.
The next step is to create a controller (CarController) and register the route in Resources/config/routing.yml.
namespace CarBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Request\ParamFetcher;
use FOS\RestBundle\Controller\Annotations as Rest;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
class CarController extends Controller
{
/**
* List cars.
*
* @Rest\Get("/cars")
* @Rest\View
*
* @ApiDoc(
* section="cars",
* description="List cars",
* statusCodes={
* 200="Returned when successful",
* 404="Not found"
* }
* )
*
* @return mixed
*/
public function getCarsAction()
{
$cars = $this->getDoctrine()
->getRepository('CarBundle:Car')
->findAll();
return View::create(array("cars" => $cars), 200);
}
}
“getCarsAction()” method returns all records coresponding to Car entity. The web service that callls the method has the route “/cars”.
Resources/config/routing.yml
Cars:
type: rest
prefix: /v1
resource: CarBundle\Controller\CarController
Finally you can see the result in the following image where the webservice is tested and returns a JSON response:
We hope this helps you. Good luck.

