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

124

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

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

Пример:

$params = helper_function( current_url() )

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

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)
noname.cs
источник

Ответы:

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;
lumos0815
источник
12

По-другому

$this->router->class
Луис Чанферони
источник
11

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

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
источник
Этот 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, совпадение имен сегментов будет потеряно.

monsterm
источник
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');
PrakashG
источник
-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 (), которые нам не нужно делать вручную.
Навид Рамзан,