Request (Обращения)

Класс Request обрабатывает запрос через список роутов, чтобы запустить нужный контроллер и получить от него результат.

Kohana поддерживает как внутренние обращения, так и внешние.

  • Внутреннее обращение — это обращение по внутреннему адресу приложения. Такой запрос обрабатывается на предмет совпадения с роутами, и если находится совпадение, то запускается контроллер, который генерирует результат. Такая схема работы позволяет приложению обращаться к своим контроллерам минуя протокол HTTP. Примером такого обращения может быть запрос /widget/weather/moscow.
  • Внешнее обращение — это обращение ко внешнему адресу, в этом случае результат просто загружается с этого адреса с помощью CURL, Steam или HTTPRequest. Пример обращения: http://news.yandex.ru/.

Использование

Чтобы составить обращение, используется метод Request::factory($uri, $cache, $injected_routes), где $uri — запрос. При первом вызове метода (он происходит в файле index.php) обращение становится начальным и в любом месте доступно через метод Request::initial(). Также при первом вызове определяется ip, user agent, сохраняются $_GET— и $_POST-данные клиента. Начальное обращение может быть только внутренним, и если указать внешний адрес, то он все равно будет искаться внутри приложения. Параметр $uri можно не передавать, в этом случае определится текущий адрес страницы.

Примером начального обращения может быть основной запрос, который запускается в конце файла index.php:

echo Request::factory()
	->execute()
	->send_headers()
	->body();

Запуск обращения

После составления запроса его необходимо запустить: это выполняет метод execute(). При внутреннем обращении, происходит поиск по списку роутов и найденный контроллер запускается, после чего результат его выполнения сохраняется. При внешнем же запросе происходит загрузка содержимого.

Полученный результат можно получить через метод body():

$response = Request::factory('category/123')->execute()->body();

Внутренние обращения

При последующих вызовах метода Request::factory(), новое обращение становится доступным через метод Request::current(). Пример обращения внутри приложения:

class Controller_Welcome extends Controller {
	public function action_index()
	{
		// Выполняем внутреннее обращение
		$internal_request = Request::factory('welcome/widget')
			->execute()->body();
		// Выводим результат обращения
		$this->response->body($internal_request . ' from action_index');
	}
	public function action_widget()
	{
		// Метод, к которому будет выполнено обращение
		$this->response->body('action_widget called');
	}
} // End Welcome

При обращении к action_index мы увидим следующее:

action_widget called from action_index

Чтобы узнать, является ли текущее обращение внутренним, нужно вызвать метод is_initial(), который вернет TRUE, если текущее обращение — начальное и FALSE если обращение сделано внутри приложения. Из контроллера это можно сделать через метод $this->request->is_initial(), но если же класс $this->request недоступен (например, из модели или представления), то можно использовать конструкцию Request::current()->is_initial(). Рассмотрим это на нашем примере:

	public function action_widget()
	{
		// Определяем, сделан ли вызов изнутри приложения
		$is_internal = !$this->request->is_initial();
		// Метод, к которому будет выполнено обращение
		$this->response->body(($is_internal ? 'internal ' : 'normal ') . 'action_widget called');
	}

Теперь, при запуске action_index отобразится:

internal action_widget called from action_index

Если же запустить action_widget обычным способом (открыть в браузере страницу /welcome/widget), то результат будет другим:

normal action_widget called

Внешние обращения

Kohana автоматически определяет обращение как внешнее, если запрос содержит ://. Рассмотрим простейший внешний запрос на нашем примере:

	public function action_index()
	{
		// Выполняем внешнее обращение к сайту kohana3.ru
		$external_request = Request::factory('http://kohana3.ru/')->execute()->body();
		// Выводим результат обращения
		$this->response->body($external_request);
	}

При установленной с помощью Kohana::init директиве expose в TRUE, Kohana будет передавать свое название и версию в качестве user-agent строки.
По умолчанию загрузка внешних адресов осуществляется через CURL. Чтобы использовать другой способ, необходимо в bootstrap.ini установить переменную Request_Client_External::$client в одно из следующих значений:

  • Request_Client_Stream. Этот способ загружает страницы используя php streams.
  • Request_Client_HTTP. Этот способ использует расширение php HTTP.
  • Request_Client_Curl. Этот способ использует расширение CURL.

Перенаправление

Выполнение приложения останавливается после запуска этого метода.
Чтобы перенаправить пользователя на другой URL-адрес используется метод redirect($url, $code), где $url — адрес для перенаправления, $code — статус HTTP ответа, с которым будет выполнено перенаправление (по умолчанию — 302). Пример перенаправления:

Request::$initial->redirect('/welcome/index');

Получение информации

Класс Request также предоставляет информацию об обращении:

Адрес

Для получения текущего адреса используется метод uri(), который возвращает адрес текущего роута. Пример использования:

echo $this->request->uri();

При открытии страницы /welcome/index?param=1 метод возвратит следующий результат:

welcome/index

Метод работает также и со внутренними обращениями:

public function action_index()
{
	// Внутренний запрос
	$internal_request = Request::factory('welcome/widget/someid')->execute()->body();
	$this->response->body('action_index: '.$this->request->uri()."\n".$internal_request);
}
 
public function action_widget()
{
	$this->response->body('action_widget: '.$this->request->uri());
}

При запуске / мы увидим следующий результат:

action_index: /
action_widget: welcome/widget/someid

Роут

Чтобы получить экземпляр объекта роута обращения, нужно вызвать метод route().

$current_route = $this->request->route();

Контроллер

Для получения названия текущего контроллера, используйте метод controller():

$controller = $this->request->controller(); // welcome

Для получения названия запущенного действия (action) контроллера, используйте метод action():

$action = $this->request->action(); // index

Директория контроллера определяется с помощью directory():

$directory = $this->request->directory();

Параметры

Для получения параметров роута используется метод param($key, $default), где $key — название параметра, $default — значение, которое будет возвращено, если параметр не существует:

$id = $this->request->param('id', 0);

Если параметр $key не передавать, то будет возвращен весь список параметров:

$params = $this->request->param();

IP-адрес

IP-адрес клиента хранится в переменной Request::$client_ip. Если Kohana запущена из командной строки, то в переменной будет храниться значение 0.0.0.0.

User-agent

Строка user-agent хранится в переменной Request::$user_agent, но помимо этого Kohana предоставляет метод Request::user_agent($value), который обрабатывает строку user-agent и выдает упорядоченную информацию, где $value — название возвращаемого параметра либо массив из названий параметров. Список доступных параметров:

  • browser — название браузера,
  • version — версия браузера,
  • robot — название робота, если это робот, иначе FALSE,
  • mobile — название мобильной платформы, если это мобильное устройство,
  • platform — название платформы, если это компьютер.

Пример использования:

var_dump(Request::user_agent(array('browser', 'platform', 'version', 'mobile', 'robot')));

Результат:

array(5) {
  ["browser"]=>
  string(5) "Opera"
  ["platform"]=>
  string(8) "Mac OS X"
  ["version"]=>
  string(4) "9.80"
  ["mobile"]=>
  bool(false)
  ["robot"]=>
  bool(false)
}

Вы можете расширить список user-agent, пример составления которого находится в конфиге system/config/user_agents.php

Referrer

Для получения referrer используйте метод referrer():

Request::initial()->referrer();

Accept-информация

Kohana предоставляет три функции для получения accept-информации:

  • Request::accept_type($type) — Возвращает список MIME-типов (либо указанный тип $type) и уровни их предпочтений, которые могут быть восприняты браузером.
  • Request::accept_lang($lang) — Возвращает список языков (либо указанный язык $lang) и уровни их предпочтений.
  • Request::accept_encoding($type) — Возвращает список поддерживаемых типов сжатия (либо указанный тип $type).

Пример:

print_r(Request::accept_type());
print_r(Request::accept_lang());
print_r(Request::accept_encoding());

Результат:

Array
(
    [image/jpeg] => 1
    [image/gif] => 1
    [image/x-xbitmap] => 1
    [image/webp] => 1
    [image/png] => 1
    [text/html] => 1
    [application/xhtml+xml] => 1
    [application/xml] => 0.9
    [*/*] => 0.1
)
Array ( [ru] => 1 [en] => 0.9 [en-US] => 0.8 [ja] => 0.7 [fr] => 0.6 [de] => 0.5 
[es] => 0.4 [it] => 0.3 [pt] => 0.2 [ko] => 0.1 [zh-TW] => 0.1 [ar] => 0.1 
[zh-CN] => 0.1 [tr] => 0.1 [hu] => 0.1 [cs] => 0.1 [sv] => 0.1 [nl] => 0.1 
[pt-PT] => 0.1 [nb] => 0.1 [da] => 0.1 [fi] => 0.1 [pl] => 0.1 )
Array
(
    [deflate] => 1
    [gzip] => 1
)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *