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-> для отримання інформації.
noname.cs

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

6
Привіт, якщо ви використовуєте Codeigniter 3, то для Controller використовуйте: $ this-> router-> class; для методу: метод $ this-> router->; для каталогу: $ this-> router-> каталог; Документація: 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
Якщо ви не змінюєте маршрути в route.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;

Дивіться посібник користувача кодигнатора

Методи маршрутизації 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.
tim peterson

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і це працює як шарм, ви не повинні використовувати сегменти урі


3

Якщо ви використовуєте сегмент $ this-> uri->, якщо змінити правила перезапису 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 клас класу в контролері $ 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 (), тоді нам не потрібно робити вручну.
Naveed Ramzan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.