Квест → Как хакнуть форму
Прошли: 77

Symfony становится всё более популярным у разработчиков как инструмент для быстрого создания приложений. Вышел Symfony 3.1, в котором много новых изменений и модернизаций, поэтому, если у вас более ранние версии, рекомендуем его обновить до 3.1
Мы уверены, что Symfony один из самых лучших фреймворков для создания rest API и в этой статье мы рассмотрим создание rest API с Symfony 3.1
Мы пройдемся по следующим пунктам:
Также, мы будем использовать postman для тестирования вашего API, так что рекомендуем установить это расширение для Chrome.
Итак, начнем.
REST — это аббревиатура Representational State Transfer. Это мост между ресурсами данных и интерфейсом приложения, — все равно, для мобильных устройств или для настольных компьютеров. REST предоставляет блок методов HTTP, используемых для работы с данными. Это базовые методы HTTP:
В основном REST работает с действиями (actions) и ресурсами. Каждый раз при вызове какого-либо урла, выполняются определенные действия, далее будут примеры.
Для создания Rest API с Symfony нам понадобится бандл FOSRestBundle, но помимо него надо поставить еще два:
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(),
# 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.