Очень часто запрос и ответ реализуются в веб-приложениях в виде классов 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']