Квест → Как хакнуть форму
Прошли: 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.