go\Request: доступ к данным запроса (PHP)

В рамках цикла «изобретение велосипедов» представляю релиз-кандидат библиотечки go\Request.

Библиотека осуществляет доступ к параметрам с которыми вызван наш сценарий: GET/POST-данные, куки, переменные окружения, заголовки запроса, настройки сервера и клиента, аргументы и опции командной строки и тому подобное.

GET, POST и всё такое

Упрощение основной рутины при ручном разборе входящих переменных.

Проверка целостности переданных данных и их соответствие форматам.

$id = $request->get->get('id', 'uint'); // Считать $_GET['id']
 
if (!$id) { // id не передано или там не целое положительное число
    die('404');
}
 
if (isset($request->post->delete)) {
    // DELETE $id
}

Числа, чекбоксы, идентификаторы, массивы, автомассивы, древовидные структуры, селекты из ограниченного набора значений и многое другое.

Проверка на доверие к запросу.

Простейший разбор формы
/* В $_POST['f'] должна прийти форма с нужным определённым строковых полей */
$form = $request->post->loadForm('f', array('name', 'email', 'age', 'sex'));
 
if (!$form) { // форма не передана
    die('404');
}
 
echo 'Имя юзера: '.$form->name;
Чуть менее простой разбор формы
$settings = array(
    'format' => array(
        'name' => array( // Имя
            'trim' => true,     // обрезать пробелы
            'maxlength' => 20,  // максимальная длина
            'notempty' => true, // не должно быть пустым            
        ),
        'email' => array( // Мыло
            'trim' => true,         // Обрезать пробелы  
            'match' => '/^@+@.+/s', // Должно соответствовать регулярке
        ),
        'age' => array( // Возраст
            'type' => 'uint', // Целое положительное число
            'range' => array(18, null), // От 18 и старше            
        ),
        'sex' => array( // Пол
            'enum' => array('male', 'female'), // SELECT с двумя значениями
        ),
    ),
);
 
$form = $request->post->loadForm('f', $settings);

Фильтрация, валидация, приведение типов полей. Рекурсивный разбор сложных форм. Различные форматы результата.

Табличные формы

Таблица со списком одинаковых элементов, которые можно редактировать?

#id   Имя   Мыло              Удалить?
 1    Вася  vasa@vasa.loc       [-]
 3    Петя  peta@peta.loc       [x]
 7    Миша  misha@misha.loc     [-]
   [Сохранить изменения]

Тоже разбирается с легкостью.

Параметры HTTP-запроса

HTTP-заголовки, информация о клиенте, настройки сервера, параметры соединения и многое другое.

echo 'Браузер пользователя: '.$request->http->client->userAgent;
echo 'ПО сервера: '.$request->http->server->soft;
echo 'Статус подключения: '.$request->connection->status;
echo 'Используется ли HTTPS? '.($request->connection->https ? 'Да' : 'Нет');
echo 'Абсолютный URI документа: '.$request->document->absolute;
echo 'Разобрать путь на сайте на компоненты: ';
print_r($request->document->components);

HTTP-авторизация. Basic и Digest.

Например, устроим себе Basic-авторизацию для списка пользователей:

use go\Request\Request;
 
/* Список пользователей. login => password */
$users = array(
    'vasya' => 'pupkin',
    'petya' => 'lojkin',
    'misha' => 'krushkin',
);
 
$auth = Request::getInstanceForSystem()->http->auth;
 
if (!$auth->checkBasicForList($users)) {
    /* Не авторизован - запрос на ввод логина/пароля */
    header($auth->getAuthHTTPStatus(true));
    header($auth->getBasicHeader('Password, please'));
    exit();
}
 
/* Успешная авторизация */
echo 'Здорово, '.$auth->user.'!';

Разбор командной строки

Разные примочки для скриптов, вызванных из консоли.

Разбор командной строки на компоненты (с учётом всех кавычек, слешей и тому подобного).

use go\Request\CLI\Argv;
 
$cmd = './script.php --opt="this is value" arg1 arg2';
$argv = Argv::createFromString($cmd);
 
print_r($argv->getArgsArray()); // ["./script.php", "--opt=this is value", "arg1", "arg2"]

Извлечение аргументов и опций разным макаром.

Разбор опций в соответствии с заданным форматом и фильтрами.

Стек вызова подзадач с передачей оставшихся аргументов.

Базовый класс для организации задач, вызываемых из командной строки.

Агрегатор всего этого

Каждый из компонентов библиотеки можно использовать отдельно и заполнять своими данными.

Либо можно использовать один объект-агрегатор, содержащий данные текущего запроса.

use go\Request\Request;
 
$request = Request::getInstanceForSystem();
 
$request->post;   // Хранилище POST-данных
$request->cookie; // Хранилище кук
$request->http->headers; // HTTP-заголовки
$request->http->client;  // Данные клиента
$request->http->auth;    // HTTP-авторизация
$request->args->getCommandLine(); // Командная строка.
$request->args->getStack(); // Стек командной строки
 
// more...

Модные штучки

Для гурманов, радующий слух набор слов: PSR-0, PSR-1, Composer, Phar, phpdoc, phpunit.

Лицензия

Лицензия — MIT

Делайте с этим что хотите, только потом не жалуйтесь.

Комментариев нет »

Комментариев ещё нет

Leave a comment