Как получить третий сегмент URI в коде крючка

Я пишу пользовательский хук post_controller. Как мы знаем, структура codeigniter uri выглядит так:

example.com/class/function/id/

и мой код:

function hook_acl()
{
    global $RTR;
    global $CI;

    $controller = $RTR->class; // the class part in uri
    $method = $RTR->method; // the function part in uri
    $id = ? // how to parse this?

    // other codes omitted for brevity
}

Я просмотрел основной файл Router.php, что меня сильно озадачило.

Благодарю.

2 ответа

Решение

Использование базового класса URI CodeIgniter

Обычно в CodeIgniter Hooks нам необходимо загрузить / создать экземпляр базового класса URI для доступа к методам.

  • За post_controller_constructor, post_controller хуки, мы можем получить суперобъект CodeIgniter и использовать uri учебный класс:
# Get the CI instance
$CI =& get_instance();

# Get the third segment
$CI->uri->segment(3);
  • Но для pre_controller хук, у нас нет доступа к суперобъекту CodeIgniter. Поэтому мы должны вручную загрузить базовый класс URI следующим образом:
# Load the URI core class
$uri =& load_class('URI', 'core');

# Get the third segment
$id = $uri->segment(3); // returns the id

Используя чистый PHP

В этом подходе вы можете использовать $_SERVER массив для извлечения сегментов URI как:

$segments = explode('/', trim($_SERVER['REQUEST_URI'], '/'));

$controller = $segments[1];
$method     = $segments[2];
$id         = $segments[3];

Вы можете использовать router учебный класс:

$this->router->fetch_class();
$this->router->fetch_method();

Или класс URI:

$this->uri->segment(1); // the class
$this->uri->segment(2); // the function
$this->uri->segment(3); // the ID
Другие вопросы по тегам