Разбор URL, чтобы получить контроллер и действие в Кохана 3 - PullRequest
0 голосов
/ 19 января 2011

У меня проблема с определением имени контроллера / действия на странице реферера в 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;
 }

1 Ответ

1 голос
/ 20 января 2011

Если вы не используете:

$controller = Request::factory($your_url_without_http)->controller;
$action = Request::factory($your_url_without_http)->action;
...