CodeIgniter: как получить информацию о контроллере, действии, URL


124

У меня есть эти URL:

Как получить имя контроллера, имя действия из этих URL. Я новичок в CodeIgniter. Есть ли вспомогательная функция для получения этой информации

Пример:

$params = helper_function( current_url() )

Где $paramsстановится что-то вроде

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)

Ответы:


217

Вы можете использовать класс URI :

$this->uri->segment(n); // n=1 for controller, n=2 for method, etc

Мне также сказали, что следующие действия работают, но в настоящее время я не могу протестировать:

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

потому что у моего контроллера есть подпапка, поэтому имя контроллера $ this-> uri-> segment (1) может быть неверным. Спасибо за вашу помощь, я использую $ this-> router для получения информации.
noname.cs

2
Для правильного получения каталога вы также можете использовать: $ this-> router-> fetch_directory ();
jmserra 08

6
Привет, если вы используете Codeigniter 3, тогда для контроллера используйте: $ this-> router-> class; для метода: $ this-> router-> method; для каталога: $ this-> router-> directory; Документация: codeigniter.com/user_guide/installation/…
cartalot

$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); оно работает.
Динеш Патра

133

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

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

Таким образом, вы знаете, что всегда используете правильные значения, даже если вы находитесь за маршрутизированным URL-адресом, в субдомене и т. Д.


Я только что узнал, что, используя этот метод, вы не можете получить правильное имя метода класса при вызове представления вроде modules::run('module/controller/action'). Он просто показывает информацию маршрутизатора загруженной страницы. Есть ли способ преодолеть это?
Starx

Потрясающие! Есть какие-нибудь сведения о том, насколько это безопасно? Т.е. это можно подделать?
HellaMad

Это должен быть принятый ответ - или использование ярлыка: $ this-> router-> class
ChristoKiwi

1
Нет, если вы измените маршруты в routes.php, $this->routerвернет класс, в котором выполняется код, но не фактический маршрутизатор, замаскированный переопределением. Оба ответа весьма полезны в зависимости от того, что вы хотите сделать.
Tibor Szasz

Эти методы были обесценены, используйте $this->router->classи $this->router->methodвместо них
Ричард

30

Эти методы устарели.

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

Вместо этого вы можете получить доступ к свойствам.

$this->router->class;
$this->router->method;

См. Руководство пользователя codeigniter

Методы маршрутизации URI fetch_directory (), fetch_class (), fetch_method ()

Со свойствами CI_Router::$directory, CI_Router::$classи CI_Router::$methodбудучи общественностью , и их соответствующего fetch_*()больше не делать что - нибудь еще , чтобы просто вернуть свойство - это не имеет смысла держать их.

Все это внутренние недокументированные методы, но мы решили отказаться от них на данный момент, чтобы на всякий случай сохранить обратную совместимость. Если некоторые из вас использовали их, теперь вы можете просто получить доступ к свойствам:

$this->router->directory;
$this->router->class;
$this->router->method;


11

В качестве дополнения

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component

Этот fetch_module()вызов у ​​меня не работает в CI 2.1.2. Не могу найти его в файле /system/router.php.
Тим Петерсон

1
@timpeterson, он доступен только в компоненте HMVC, как сказано в ответе.
Starx,

спасибо, ты спас меня
Barbz_YHOOL

7

Обновить

Ответ был добавлен в 2015 году, и сейчас следующие методы устарели.

$this->router->fetch_class();  in favour of  $this->router->class; 
$this->router->fetch_method(); in favour of  $this->router->method;

Привет, вам следует использовать следующий подход

$this->router->fetch_class(); // class = controller
$this->router->fetch_method(); // action

для этой цели, но для этого вам нужно удлинить крючок из, CI_Controllerи он работает как шарм, вам не следует использовать сегменты uri


3

Если вы используете $ this-> uri-> segment, при изменении правил перезаписи URL, совпадение имен сегментов будет потеряно.


3

Используйте этот код где угодно в классе или библиотеках

    $current_url =& get_instance(); //  get a reference to CodeIgniter
    $current_url->router->fetch_class(); // for Class name or controller
    $current_url->router->fetch_method(); // for method name

1

Последний сегмент URL-адреса всегда будет действием. Пожалуйста, получите вот так:

$this->uri->segment('last_segment');

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

// fecth class класс в контроллере $ this-> router-> fetch_method ();

// метод


-4

класс контроллера не работает ни одной функции.

поэтому я рекомендую вам использовать следующие скрипты

global $argv;

if(is_array($argv)){
    $action = $argv[1];
    $method = $argv[2];
}else{
    $request_uri = $_SERVER['REQUEST_URI'];
    $pattern = "/.*?\/index\.php\/(.*?)\/(.*?)$/";
    preg_match($pattern, $request_uri, $params);
    $action = $params[1];
    $method = $params[2];
}

Доступны предопределенные функции, такие как $ this-> router-> fetch_class () и fetch_method (), которые нам не нужно делать вручную.
Навид Рамзан,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.