Website development
PHP
January 2014 6

Создание простого REST-приложения на Silex

Original author: David Makin
Translation
В этой статье мы создадим простое REST приложение на PHP-фреймворке Silex, начав с установки Silex и закончив созданием нескольких маршрутов приложения.
Silex — это PHP микро-фреймворк от создателей Symfony и во многом построенный на его базе. Подробнее о нем можно узнать из следующего хабрапоста


Давайте начнём


Для этого примера я буду использовать каталог с именем toyshop

Установка Silex


Есть несколько способов установки Silex, но давайте используем для этого Composer.
Внутри вашей рабочей директории выполните команду:

composer require silex/silex ~1.1


С помощью этой команды вы дали команду Composer сделать следующее:
  • require добавляет новый пакет к проекту
  • silex / silex имя пакета в формате поставщик(vendor)/пакет(package)
  • ~ 1.1 — версия пакета, ~ 1.1 означает >= 1.1, <2,0


Когда Вы запустите эту команду, Вы увидите, что Composer установит также и библиотеки, которые Вы не запрашивали, — не волнуйтесь, так и должно было произойти, так как Silex требует наличия этих библиотек, для корректной работы.

Как только команда закончит выполнение, вы получите следующую файловую структуру, приведённую ниже:
toyshop/
       composer.json
       composer.lock
       vendor/
             ...


Весь код Silex хранится внутри папки vendor, а 2 файла Composer'a содержат информацию о том, какие пакеты и версии библиотек установлены.

Composer.json


Давайте посмотрим внутрь composer.json, он должен выглядеть примерно так:
{
    "require": {
        "silex/silex": "~1.1"
    }
}


Composer.lock


Этот файл содержит список всех установленных пакетов, а также их версии. Это очень полезно, поскольку это означает, что Вы теперь не должны делать commit папки vendor/, когда заливаете проект в репозиторий — все библиотеки, необходимые для корректной работы приложения, могут быть установлены на основе этого файла. Вам лишь необходимо залить в репозиторий файлы composer.json и composer.lock и тогда, как только код будет извлечен из репозитория, Вы можете просто запустить команду composer install и Composer сам установит необходимые библиотеки указанных версий.

Создание маршрутов



Так как наше приложение — это магазин игрушек, давайте подумаем, что нам будет нужно. Люди, которые будут заходить на наш сайт, захотят увидеть подарки, значит давайте создадим маршрут, который позволит получить список подарков.

Давайте создадим файл index.php. Добавим в него код, чтобы он выглядел следующим образом:
<?php
 require_once __DIR__.'/vendor/autoload.php';
  
 $app = new Silex\Application();
 // Please set to false in a production environment
 $app['debug'] = true;
 
 $toys = array(
     '00001'=> array(
        'name' => 'Racing Car',
        'quantity' => '53',
        'description' => '...',
        'image' => 'racing_car.jpg',
    ),
    '00002' => array(
        'name' => 'Raspberry Pi',
        'quantity' => '13',
        'description' => '...',
        'image' => 'raspberry_pi.jpg',
    ),
);

$app->get('/', function() use ($toys) {
    return json_encode($toys);
});

$app->get('/{stockcode}', function (Silex\Application $app, $stockcode) use ($toys) {
    if (!isset($toys[$stockcode])) {
        $app->abort(404, "Stockcode {$stockcode} does not exist.");
    }
    return json_encode($toys[$stockcode]);
});

$app->run();


Теперь у нас объявлено 2 маршрута: / и /{stockcode}

Маршрут /


Это маршрут для получения списка всех игрушек. Все, что делает данный метод — это кодирует данный в JSON и возвращает закодированные данные в качестве ответа на запрос.

Чтобы разрешить анонимной функции доступ к массив $toys мы должны импортировать его, добавив use($toys) в конце определения анонимной функции, но до открытия скобки {.

Маршрут /{stockcode}


Это маршрут для получения информации о конкретной игрушке, которая идентифицируется параметром stockcode. Как Вы видете, что это в этом маршруте используется функция с чуть более сложным заголовком.

Наряду с use($toys) мы передаем пару переменных в саму функцию: Silex\Application $app и $stockcode.

Silex\Application $app — это объект приложения Silex и с его помощью мы можем вывести красивую страницу ошибки 404, если был передан неверный stockcode.

$stockcode — идентификатор игрушки, информацию о которой мы хотим получить. Как Вы видете, эта переменная соответствует {stockcode}, который есть в описанном нами маршруте.

Тестируем приложение



После настройки веб-сервера для маршрутизации всех запросов через index.php можно перейти к маршрутам с помощью toyshop и toyshop/00001 и увидеть результат, который вернёт каждый из этих запросов.

Например, toyshop/00001 вернёт:
{"name":"Raspberry Pi","quantity":"13","description":"...","image":"raspberry_pi.jpg"}


Ответ возвращает в удобном формате, подходящем для использования в Вашем интернет-магазине или мобильном приложений. Всё, что надо сделать, это выполнить над этими данными функцию json_decode и отобразить данные в удобном формате, например, HTML.

Почему Silex?


Хороший вопрос.
Ответ: поскольку это микро-фреймворк, он не заставляет меня писать в своём ​​собственном предпочтительном стиле и выходит мне не нужно менять свой стиль программирования, чтобы работать с Silex. Если бы Вы хотели, Вы могли бы использовать Slim, любой другой микро-фреймворк или даже полноценные фреймворки как Symfony или Zend.

Примечания от переводчика


Хотелось бы добавить, что также легко работать в Silex и с другими типами HTTP-запросов, такими, как PUT, POST, DELETE (пример ниже)
$app->post('/toys', function (Silex\Application $app) use ($toys) {
   //...
});

$app->put('/{stockcode}', function (Silex\Application $app, $stockcode) use ($toys) {
   //...
});

$app->delete('/{stockcode}', function (Silex\Application $app, $stockcode) use ($toys) {
   //...
});


Таким образом можно создать полноценное REST-приложение.
+1
21k 49
Comments 15
Top of the day