У меня проблема с определением имени контроллера / действия на странице реферера в Kohana 3.
Что мне нужно сделать, это определить, является ли страница реферера внутренней или внешней. Если она внешняя (например, от Google), я сделаю некоторые настройки по умолчанию. Если это внутренний реферер (то есть из того же домена), мне нужно сделать что-то другое в соответствии с контроллером и информацией о действиях на этой странице реферера.
Я начинаю с проверки $ _SERVER ["HTTP_REFERRER"], но я застрял при получении имени контроллера и действия из этой переменной. Поскольку я настроил маршруты в начальной загрузке, я хочу получить тот же
Я знаю, что Kohana предоставляет методы для получения контроллера и действия текущего запроса.
$this->request->controller
$this->request->action
$this->request->param('paramname')
Пока мы задаемся вопросом, существуют ли методы, которые могут анализировать заданную строку URL и возвращать информацию контроллера / действия / параметров.
Есть идеи ??
UPDATE:
После нескольких часов изучения исходного кода Kohana я нашел решение, которое состоит из 2 шагов:
Шаг 1. преобразовать URL в URI. Если это от внешнего реферера, URI должен быть НЕДЕЙСТВИТЕЛЕН.
function URL2URI($URL)
{
if (empty($URL)) return NULL;
$url_info = parse_url($URL);
if (!isset($url_info['host']) || !isset($url_info['path'])) return NULL;
return ($url_info['host'] === $_SERVER['HTTP_HOST']) ? ltrim($url_info['path'], '/') : NULL;
}
Шаг 2. Протестируйте URI со всеми маршрутами и получите информацию о маршруте, который соответствует URI ($ match ['controller'], $ match ['action']).
function getInfoFromURI($URI)
{
if (empty($URI)) return NULL;
$routes = Route::all();
foreach ($routes as $oneRoute)
if ($match = $oneRoute->matches($URI))
return $match;
return NULL;
}