Cовременный подход к HTTP с PHPixie и PSR-7

imageСтандартный PHP API для работы с HTTP запросами давно устарел. Программисты научились не использовать глобальные переменные, но стандартные суперглобалы как $_GET, $_SERVER все еще напоминают нам о далеком прошлом. Конечно фреймворки инкапсулируют эту информацию в свои Request\Response классы, но таких реализаций очень много и пока еще не было единственного стандарта. Стандарт PSR-7 от PHP-FIG как раз должен привести репрезентацию HTTP протокола к единственному знаменателю что позволит писать Middleware который будет работать сразу на многих фреймворках. Он пока еще не принят, но досрочное голосование показало практически единоголосную поддержку нового стандарта. PHPixie готовясь к релизу версии 3.0 уже приняла и имплементировала PSR-7, а также предоставляет обертки для упрощенной работы с интерфейсом. Если вы хотите создать свой микрофреймворк то взяв PHPixie HTTP за основу, сможете добиться результатов уже за один вечер.Теперь посмотрим на саму реализацию: $slice = new \PHPixie\Slice (); $http = new \PHPixie\HTTP ($slice); RequestPSR-7 довольно упрощенный интерфейс и предоставляет параметры $_GET и $_POST в виде массивов как и сам PHP, обертки PHPixie значительно упрощают работу с ними:

//Строим запрос из глобальных переменных $request = $http→request ();

//Можно также явно предоставить уже полученную //имплементацию PSR-7 ServerRequestInterface $request = $http→request ($serverRequest);

//$_GET $query = $request→query ();

//$_POST $query = $request→data ();

//Дополнительные аттрибуты //Например данные из рутинга $query = $request→attributes ();

//$_GET['pixie'] $query→get ('pixie');

//С дефолтным значением $query→get ('pixie', 'Trixie');

//Выбросит ошибку если параметр отсутствует $query→getRequired ('pixie');

//$_GET['user']['name']; $query→get ('user.name');

//Или так $userData = $query→slice ('user'); $userData→get ('name');

//Кстати в таком случае $userData //это экземпляр \PHPixie\Slice\Data //никак не связанного с HTTP //и его можно смело передать куда-то еще

//Доступ к параметрам сервера аналогичен $request→server ()→get ('http_host');

//получит все значение хедера через кому $request→headers ()→get ('host'); $request→headers ()→getRequired ('host');

//значения хедера как массив $request→headers ()→getLines ('accept');

//Загруженные файлы по стандарту PSR-7 $uploadedFile = $request→uploads ()→get ('file'); $uploadedFile→move ('/images/fairy.png');

//Информация о URI запроса $uri = $request→uri (); $path = $uri→getPath ();

//И наконец-то чтобы получить чистую //реализацию ServerRequestInterface $serverRequest = $request→serverRequest ();

ResponseКроме самой обертки над HTTP ответами, PHPixie также сможет построить часто используемые ответы автоматически, чтобы избавить вас от возни с хедерами. Конечно после того как ответ построен его можно модифицировать по вкусу.

$responses = $http→responses ();

//Самый простой ответ $response = $responses→string ('hello world');

//JSON с правильными хедерами что запрещают кэш $responses→json (array ('name' => 'Pixie'));

//Редирект $responses→redirect ('http://phpixie.com/');

//Стриминг файла $responses→streamFile ('pixie.png');

//Скачка текста как файл на компьютер пользователя //например для CSV, TXT $responses→download ('name.txt', 'text/plain', 'Trixie');

//Скачка реального файла $responses→downloadFile ('pixie.png', 'image.png', 'images/fairy.png');

//Модификация статуса $response→setStatus ('404', 'Not Found');

//Стандартный текст ответа подставится автоматически $response→setStatus ('404');

//Модификация хедеров $response→headers→set ('Content-Type', 'text/csv');

//Получить PSR-7 ResponseInterface $response→asResponseMessage ();

//И вывести $http→output ($response);

ContextКазалось бы это все, но мы пропустили cookies и сессию. Они относятся как до запроса так и до ответа и часто к ним требуется доступ не только в контроллере, но и в других местах, например в модуле авторизации. PHPixie выделяет их в отдельный Context.

//Сначало надо получить контекст относительно запроса $context = $http→context ($request);

//А дальше все просто и по аналогии $cookies = $context→cookies (); $session = $context→session ();

$cookies→set ('lang', 'en'); $session→getRequired ('user_id');

//Надо только помнить указывать контекст //при выводе ответа $http→output ($response, $context); $response→asResponseMessage ($context); Существуют и другие имплементации PSR-7, но они пока без оберток и контекста что не делает работу с ними довольно неудобной. Довольно большое число из них используют трейты и тем самым нуждаются в версии PHP 5.4+.

В то время все библиотеки PHPixie работают под любой версией PHP старше 5.3 (включая новую 7 и HHVM) и вдобавок на 100% покрыты юнит тестами. Сам код можно найти на github.com/phpixie/http

© Habrahabr.ru