Очень часто запрос и ответ реализуются в веб-приложениях в виде классов Request и Response. Тогда все что нужно будет приложению это определить путь запроса Request и вернуть соответствующий пути ответ Response. UML-диаграмма классов Request и Response представлена ниже:
Как мы видим в классе Request есть три метода:
- getPathInfo() - метод получения пути запроса
- find(key) - поиск параметра запроса по ключу key
- has(key) - проверка существования параметра в запроса
- Response(content, status_code, headers) - конструктор класса, принимает в качестве параметров один обязательный содержимое ответа и два не обязательных status_code (200 - по умолчанию), headers - массив HTTP-заголовков
- setStatusCode(status_code) - из названия понятно что этот метод делает
- setHeader(header) - то же
- send() - отправка ответа на вывод
- content - содержимое ответа
- status_code - код ответа
- headers - массив, содержащий HTTP-заголовки ответа
<?php /** * File: Request.class.php * Created: 15.10.2012 12:30 * * Класс Request */ class Request { /** * Получить путь запроса без строки запроса и имени выполняемого * скрипта * * @return string */ public function getPathInfo() { // получаем значения: // // - URI без имени хоста // - строки запроса после ? // - имя выполняемого скрипта $request_uri = $_SERVER['REQUEST_URI']; $query_string = $_SERVER['QUERY_STRING']; $script_name = $_SERVER['SCRIPT_NAME']; // извлекаем из URI путь запроса, $path_info = str_replace( '?' . $query_string, '', $request_uri); $path_info = str_replace( $script_name, '', $path_info); $path_info = trim($path_info, '/'); // возвращаем результат return empty($path_info) ? '/' : $path_info; } /** * Поиск и получение значения параметра зпроса * по ключу * * @param string $key искомый ключ параметра запроса * @return mixed значение параметра * или null если параметр не существует */ public function find($key) { if ( key_exists($key, $_REQUEST) ) return $_REQUEST[$key]; else return null; } /** * Проверяет существование параметра в запросе * по его ключу * * @param string $key проверяемый ключ * @return boolean */ public function has($key) { return key_exists($key, $_REQUEST); } } ?>А теперь класс Response:
<?php /** * File: Response.class.php * Created: 15.10.2012 13:17 * * Класс Response. */ class Response { private $content; private $status_code; private $headers; /** * Создает ответ сервера * * @param string $content содержимое ответа * @param integer $status_code HTTP-статус код ответа * @param array $headers HTTP-заголовки ответа */ public function __construct($content, $status_code = 200, $headers = array()) { // устанавливаем свойства класса $this->content = $content; $this->status_code = $status_code; $this->headers = $headers; } public function setStatusCode($status_code) { $this->status_code = $status_code; } public function setHeader($header) { $this->headers[] = $header; } public function send() { // выслать код статуса HTTP header('HTTP/1.1 ' . $this->status_code); // отправить заголовки HTTP foreach ( $this->headers as $header ) header($header); // отправить содержимое ответа echo $this->content; } } ?>
Пример использования этих классов index.php:
<?php // подключаем объявления классов require_once 'class/Request.class.php'; require_once 'class/Response.class.php'; // определяем путь запроса $request = new Request(); $path_info = $request->getPathInfo(); // создаем ответ в соответствии с путем запроса if ( $path_info == '/' ) $response = new Response('Main page'); else if ( $path_info == 'contact') $response = new Response('Contact page'); else $response = new Response('Not found 404', 404); // возвращаем ответ клиенту $response->send(); ?>
Эти три файла служат хорошим костяком для веб-приложения.
Не проще ли
ОтветитьУдалить$path_info = parse_url($_SERVER['REQUEST_URI'])['path']