CodeIgniter: Jak uzyskać informacje o kontrolerze, działaniu i adresie URL

124

Mam te adresy URL:

Jak uzyskać nazwę kontrolera, nazwę akcji z tych adresów URL. Jestem nowicjuszem CodeIgniter. Czy jest jakaś funkcja pomocnicza, aby uzyskać te informacje

Dawny:

$params = helper_function( current_url() )

Gdzie $paramsstaje się coś podobnego

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)
noname.cs
źródło

Odpowiedzi:

217

Możesz użyć klasy URI :

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

Powiedziano mi również, że następująca praca, ale obecnie nie mogę przetestować:

$this->router->fetch_class();
$this->router->fetch_method();
Sampson
źródło
ponieważ mój kontroler ma podfolder, więc $ this-> uri-> segment (1) zwraca nazwę kontrolera może być niepoprawna. Dziękuję za pomoc, używam $ this-> routera, aby uzyskać informacje.
noname.cs
2
Aby uzyskać poprawny katalog, możesz również użyć: $ this-> router-> fetch_directory ();
jmserra
6
Hej, jeśli używasz Codeigniter 3, to dla Kontrolera użyj: $ this-> router-> class; dla metody: $ this-> router-> method; dla katalogu: $ this-> router-> directory; Dokumentacja: codeigniter.com/user_guide/installation/…
cartalot
$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); to działa.
Dinesh Patra
133

Zamiast używać segmentów URI, powinieneś zrobić to:

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

Dzięki temu wiesz, że zawsze używasz prawidłowych wartości, nawet jeśli znajdujesz się za routowanym adresem URL, w subdomenie itp.

Phil Sturgeon
źródło
Właśnie się dowiedziałem, że używając tej metody, nie możesz uzyskać poprawnej nazwy metody klasy podczas wywoływania widoku takiego jak modules::run('module/controller/action'). Pokazuje tylko informacje o routerze załadowanej strony. Czy jest jakiś sposób, aby temu zaradzić?
Starx
Niesamowite! Jakieś informacje o tym, jak bezpieczne jest to? Czy można to sfałszować?
HellaMad
Powinna to być akceptowana odpowiedź - lub używając skrótu: $ this-> router-> class
ChristoKiwi
1
Nie, jeśli zmienisz trasy w route.php, $this->routerzwraca klasę, w której działa kod, ale nie zwraca rzeczywistego routera zamaskowanego przez zastąpienie. Obie odpowiedzi są dość przydatne w zależności od tego, co chcesz zrobić.
Tibor Szasz
Te metody zostały pozbawione, używaj $this->router->classi $this->router->methodzamiast tego
Richard
30

Metody są przestarzałe.

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

Zamiast tego możesz uzyskać dostęp do właściwości.

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

Zobacz podręcznik użytkownika Codeigniter

Metody routingu URI fetch_directory (), fetch_class (), fetch_method ()

O właściwościach CI_Router::$directory, CI_Router::$classi CI_Router::$methodsamopoczucia społeczeństwa i ich odpowiedniefetch_*() nie robi nic innego, tylko powrót właściwości - to nie ma sensu, aby je zachować.

Są to wszystkie wewnętrzne, nieudokumentowane metody, ale na razie zdecydowaliśmy się je wycofać, aby na wszelki wypadek zachować zgodność wsteczną. Jeśli niektórzy z was korzystali z nich, możesz teraz po prostu uzyskać dostęp do właściwości:

$this->router->directory;
$this->router->class;
$this->router->method;
lumos0815
źródło
12

Inny sposób

$this->router->class
Luis Chanferoni
źródło
11

Jako dodatek

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
źródło
To fetch_module()wywołanie nie działa dla mnie w CI 2.1.2. Nie można go znaleźć w pliku /system/router.php.
tim Peterson
1
@timpeterson, jest dostępny tylko w komponencie HMVC, jak podano w odpowiedzi.
Starx
dziękuję, uratowałeś mnie
Barbz_YHOOL
7

Aktualizacja

Odpowiedź została dodana w 2015 roku, a następujące metody są obecnie przestarzałe

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

Cześć, powinieneś zastosować następujące podejście

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

w tym celu ale żeby z tego skorzystać trzeba wyciągnąć haczyk z CI_Controlleri działa jak urok, nie należy używać segmentów uri

Muhammad Omer Aslam
źródło
3

Jeśli używasz $ this-> uri-> segment, jeśli zmienią się reguły przepisywania adresów URL, dopasowanie nazw segmentów zostanie utracone.

potwór
źródło
3

Użyj tego kodu w dowolnym miejscu w klasie lub bibliotekach

    $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
Aslam Patel
źródło
1

Akcją zawsze będzie ostatni segment adresu URL. Proszę, bądź taki:

$this->uri->segment('last_segment');
PrakashG
źródło
-1
$this->router->fetch_class(); 

// fecth dodaj klasę do kontrolera $ this-> router-> fetch_method ();

// metoda

Fel
źródło
-4

Klasa kontrolera nie obsługuje żadnych funkcji.

więc polecam skorzystać z poniższych skryptów

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];
}
Jun Takeshita
źródło
Istnieją predefiniowane funkcje, takie jak $ this-> router-> fetch_class () i fetch_method (), więc nie musimy robić tego ręcznie.
Naveed Ramzan