PHP Profi

Создание Rest-API с Symfony 3.1 Перевод

Symfony становится всё более популярным у разработчиков как инструмент для быстрого создания приложений. Вышел Symfony 3.1, в котором много новых изменений и модернизаций, поэтому, если у вас более ранние версии, рекомендуем его обновить до 3.1

Мы уверены, что Symfony один из самых лучших фреймворков для создания rest API и в этой статье мы рассмотрим создание rest API с Symfony 3.1

Мы пройдемся по следующим пунктам:

  • Что такое Rest API
  • Доступные бандлы для Rest API
  • Регистрация бандлов
  • Конфигурация
  • Создание сущности пользователя
  • GET, POST, PUT, DELETE

Также, мы будем использовать postman для тестирования вашего API, так что рекомендуем установить это расширение для Chrome.

Итак, начнем.

Что такое Rest API

REST — это аббревиатура Representational State Transfer. Это мост между ресурсами данных и интерфейсом приложения, — все равно, для мобильных устройств или для настольных компьютеров. REST предоставляет блок методов HTTP, используемых для работы с данными. Это базовые методы HTTP:

  • GET — для чтения и извлечения данных
  • POST — для вставки данных
  • PUT — для обновления данных
  • DELETE — для удаления данных

В основном REST работает с действиями (actions) и ресурсами. Каждый раз при вызове какого-либо урла, выполняются определенные действия, далее будут примеры.

Доступные бандлы для Rest API

Для создания Rest API с Symfony нам понадобится бандл FOSRestBundle, но помимо него надо поставить еще два:

  • JMSSerializerBundle
  • NelmioCorsBundle

FOSRestBundle является основой для Rest API Symfony, принимает запрос клиента и возвращает соответствующий ответ. JMSSerializerBundle помогает с сериализацией данных в соответствии с нужным форматом, а именно JSON, XML или YAML. NelmiCorsBundle описывает допустимые домены для вашего API.

Для установки этих бандлов просто запустите команды в терминале:

composer require friendsofsymfony/rest-bundle
composer require jms/serializer-bundle
composer require nelmio/cors-bundle

 

Регистрация бандлов

После успешной установки пакетов вам нужно зарегистрировать их в AppKernel.php, файле, находящемся в папке приложения. Откройте этот файл и добавьте туда следующие строки:

new FOS\RestBundle\FOSRestBundle(),
new JMS\SerializerBundle\JMSSerializerBundle(),
new Nelmio\CorsBundle\NelmioCorsBundle(),

Конфигурация в config.yml

# Nelmio CORS Configuration
nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: ['*']
        allow_headers: ['*']
        allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
        max_age: 3600
        hosts: []
        origin_regex: false
 
# FOSRest Configuration
fos_rest:
    body_listener: true
    format_listener:
        rules:
            - { path: '^/', priorities: ['json'], fallback_format: json, prefer_extension: false }
    param_fetcher_listener: true
    view:
        view_response_listener: 'force'
        formats:
            json: true

Таким образом, мы настроили FOSRestBundle и NelmioCorsBundle. Теперь у нас все готово, чтобы сделать наш первый объект для манипулирования данными из различных вызовов.

Создание сущности пользователя

Нам нужны некоторые данные для создания, обновления и удаления. Для этого создадим объект пользователя. Для простоты ограничимся только именем и ролью. Зайдите в папку приложения и запустите следующую команду в терминале:

$ php bin/console generate:doctrine:entity

 

Эта команда запустит создатель сущностей и спросит имя для создаваемой сущности. Вам нужно будет указать имя сущности и бандл приложения, что-то вроде того AppBundle:User, это нужно для аннотации. Просто нажимайте Enter и заполняйте поля, поле id заполнится автоматически.

После создания сущности нужно обновить схему базы данных для добавления таблицы. Запустите следующую команду:

$ php bin/console doctrine:schema:update --force

Проверьте, создалась ли новая таблица в базе данных.

Теперь вставим данные в таблицу:

INSERT INTO `user` (`name`, `role`) VALUES
('tony', 'community manager'),
('sandy', 'digital content producer'),
( 'michael', 'php community manager');

Получение записей из таблицы

Перейдите в AppBundle/Controller, создайте файл UserController.php и добавьте следующие пространства имен и зависимости:

namespace AppBundle\Controller;
 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use AppBundle\Entity\User;

 

Теперь объявите UserController, пронаследовав его от FOSUserBundle

class UserController extends FOSRestController
{
}

Создадим первый роут для Get и метод для извлечения данных. Если записей нет, во вью будет показан ответ. Скопируйте следующий код в UserController:

* @Rest\Get("/user")
     */
    public function getAction()
    {
      $restresult = $this->getDoctrine()->getRepository('AppBundle:User')->findAll();
        if ($restresult === null) {
          return new View("there are no users exist", Response::HTTP_NOT_FOUND);
     }
        return $restresult;
    }

Проверим, извлекаются ли данные у нашего API с помощью postman

Вы должны найти свой URL приложения в странице доступа к приложениям на Cloudways. Скопируйте URL в postman с суффиксом /user.

Если вы хотите получить только одну запись и передать идентификатор пользователя в idAction() и в метод find(), вам нужно создать новый роут вроде такого:

/**
* @Rest\Get("/user/{id}")
*/
public function idAction($id)
{
   $singleresult = $this->getDoctrine()->getRepository('AppBundle:User')->find($id);
   if ($singleresult === null) {
   return new View("user not found", Response::HTTP_NOT_FOUND);
   }
return $singleresult;
}

Проверим вызов API в postman по URL:

 

Вставка данных в базу

Чтобы сделать новую запись в базе данных, добавьте следующий код в класс UserController

/**
* @Rest\Post("/user/")
*/
public function postAction(Request $request)
{
   $data = new User;
   $name = $request->get('name');
   $role = $request->get('role');
if(empty($name) || empty($role))
{
   return new View("NULL VALUES ARE NOT ALLOWED", Response::HTTP_NOT_ACCEPTABLE);
}
  $data->setName($name);
  $data->setRole($role);
  $em = $this->getDoctrine()->getManager();
  $em->persist($data);
  $em->flush();
   return new View("User Added Successfully", Response::HTTP_OK);
}

 

Теперь попытаемся создать запись через postman

Можно проверить, добавился пользователь или нет, вызвав через метод GET список всех пользователей.

 

Обновление данных в базе

Чтобы обновить запись, добавим вызов PUT в роут и напишем код, предоставленный ниже. В основном он будет принимать идентификатор пользователя для получения имени и роли пользователя, после чего вы можете отредактировать поля и обновить его заголовок, введя в postamn.

* @Rest\Put("/user/{id}")
*/
public function updateAction($id,Request $request)
{
$data = new User;
$name = $request->get('name');
$role = $request->get('role');
$sn = $this->getDoctrine()->getManager();
$user = $this->getDoctrine()->getRepository('AppBundle:User')->find($id);
if (empty($user)) {
   return new View("user not found", Response::HTTP_NOT_FOUND);
}
elseif(!empty($name) && !empty($role)){
   $user->setName($name);
   $user->setRole($role);
   $sn->flush();
   return new View("User Updated Successfully", Response::HTTP_OK);
}
elseif(empty($name) && !empty($role)){
   $user->setRole($role);
   $sn->flush();
   return new View("role Updated Successfully", Response::HTTP_OK);
}
elseif(!empty($name) && empty($role)){
$user->setName($name);
$sn->flush();
return new View("User Name Updated Successfully", Response::HTTP_OK);
}
else return new View("User name or role cannot be empty", Response::HTTP_NOT_ACCEPTABLE);
}

 

Теперь введем в postman id пользователя в URL и изменим заголовок на PUT. Добавим обновленные записи в Params и отправим запрос

Удаление данных из базы

Для удаления записи через вызов API, необходимо передать идентификатор пользователя в URL. Добавьте роут и метод в классе:

/**
* @Rest\Delete("/user/{id}")
*/
public function deleteAction($id)
{
  $data = new User;
  $sn = $this->getDoctrine()->getManager();
  $user = $this->getDoctrine()->getRepository('AppBundle:User')->find($id);
if (empty($user)) {
  return new View("user not found", Response::HTTP_NOT_FOUND);
}
else {
  $sn->remove($user);
  $sn->flush();
}
  return new View("deleted successfully", Response::HTTP_OK);
}

Проверим в postman

 

Итак, все методы работают прекрасно и мы сделали Rest API, теперь только следуйте инструкциям и вы сможете создавать API с Symfony.

2016-10-03 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий