В этой статье мы создадим простое REST
приложения на Silex
, начав с установки Silex
и закончив созданием нескольких маршрутов приложения.
Давайте начнём
Для этого примера я буду использовать каталог с именем 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 SilexApplication();
// 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 (SilexApplication $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)
мы передаем пару переменных в саму функцию: SilexApplication $app и $stockcode.
SilexApplication $app
— это объект приложения Silex и с его помощью мы можем вывести красивую страницу ошибки 404, если был передан неверный stockcode.
$stockcode
— идентификатор игрушки, информацию о которой мы хотим получить. Как Вы видете, эта переменная соответствует {stockcode}, который есть в описанном нами маршруте.
Тестируем приложение
После настройки веб-сервера для маршрутизации всех запросов через index.php можно перейти к маршрутам с помощью http://toyshop/ и http://toyshop/00001
и увидеть результат, который вернёт каждый из этих запросов.
Например, http://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 (SilexApplication $app) use ($toys) {
//...
});
$app->put('/{stockcode}', function (SilexApplication $app, $stockcode) use ($toys) {
//...
});
$app->delete('/{stockcode}', function (SilexApplication $app, $stockcode) use ($toys) {
//...
});
Таким образом можно создать полноценное REST-приложение.
Автор: andrewnester