CodeIgniter: Cara mendapatkan Controller, Action, informasi URL

124

Saya memiliki URL ini:

Cara mendapatkan nama pengontrol, nama tindakan dari URL ini. Saya pemula CodeIgniter. Apakah ada fungsi pembantu untuk mendapatkan info ini

Ex:

$params = helper_function( current_url() )

Dimana $paramsmenjadi seperti itu

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

Jawaban:

217

Anda bisa menggunakan Kelas URI :

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

Saya juga telah diberi tahu bahwa pekerjaan berikut, tetapi saat ini saya tidak dapat menguji:

$this->router->fetch_class();
$this->router->fetch_method();
Sampson
sumber
karena pengontrol saya memiliki sub folder, jadi $ this-> uri-> segmen (1) mengembalikan nama pengontrol mungkin salah. Terima kasih atas bantuan Anda, saya menggunakan $ this-> router untuk mendapatkan informasi.
noname.cs
2
Untuk mendapatkan Direktori dengan Benar Anda juga dapat menggunakan: $ this-> router-> fetch_directory ();
jmserra
6
Hai jika Anda menggunakan Codeigniter 3, maka untuk Controller gunakan: $ this-> router-> class; untuk Metode: $ this-> router-> method; untuk Direktori: $ this-> router-> directory; Dokumentasi: codeigniter.com/user_guide/installation/…
cartalot
$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); berhasil.
Dinesh Patra
133

Daripada menggunakan segmen URI, Anda harus melakukan ini:

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

Dengan cara itu Anda tahu bahwa Anda selalu menggunakan nilai yang benar meskipun Anda berada di belakang URL yang dirutekan, di sub-domain, dll.

Phil Sturgeon
sumber
Saya baru tahu, bahwa dengan menggunakan metode ini, Anda tidak bisa mendapatkan nama metode kelas yang benar saat memanggil tampilan seperti modules::run('module/controller/action'). Itu hanya menunjukkan informasi router dari halaman yang dimuat. Apakah ada cara untuk mengatasinya?
Starx
Hebat! Ada kabar tentang seberapa aman ini? Yaitu bisakah ini dipalsukan?
HellaMad
Ini harus menjadi jawaban yang diterima - atau menggunakan pintasan: $ this-> router-> class
ChristoKiwi
1
Tidak jika Anda mengubah rute di routes.php, $this->routermengembalikan kelas tempat kode dijalankan, tetapi bukan router sebenarnya yang ditutup dengan override. Kedua jawaban tersebut cukup berguna berdasarkan apa yang ingin Anda lakukan.
Tibor Szasz
Metode ini telah dihilangkan, gunakan $this->router->classdan $this->router->methodsebagai gantinya
Richard
30

Metode tidak digunakan lagi.

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

Anda dapat mengakses properti sebagai gantinya.

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

Lihat panduan pengguna codeigniter

Metode Perutean URI fetch_directory (), fetch_class (), fetch_method ()

Dengan properti CI_Router::$directory, CI_Router::$classdan CI_Router::$methodmenjadi publik dan masing-masingfetch_*() tidak lagi melakukan hal lain untuk mengembalikan properti - tidak masuk akal untuk menyimpannya.

Itu semua adalah metode internal dan tidak terdokumentasi, tetapi kami telah memilih untuk menghentikannya untuk saat ini untuk mempertahankan kompatibilitas mundur untuk berjaga-jaga. Jika beberapa dari Anda telah menggunakannya, Anda sekarang dapat mengakses propertinya saja:

$this->router->directory;
$this->router->class;
$this->router->method;
lumos0815
sumber
12

Cara lain

$this->router->class
Luis Chanferoni
sumber
11

Sebagai tambahan

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
sumber
Ini fetch_module()panggilan tidak bekerja untuk saya di CI 2.1.2. Tidak dapat menemukannya di file /system/router.php.
tim peterson
1
@timpeterson, Ini hanya tersedia di komponen HMVC seperti yang diceritakan dalam jawaban.
Starx
terima kasih, Anda menyelamatkan saya
Barbz_YHOOL
7

Memperbarui

Jawabannya ditambahkan pada tahun 2015 dan metode berikut tidak digunakan lagi sekarang

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

Hai, Anda harus menggunakan pendekatan berikut

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

untuk tujuan ini tetapi untuk menggunakan ini Anda perlu memperpanjang hook Anda dari CI_Controllerdan berfungsi seperti pesona, Anda tidak boleh menggunakan segmen uri

Muhammad Omer Aslam
sumber
3

Jika Anda menggunakan $ this-> uri-> segment, jika aturan penulisan ulang url berubah, pencocokan nama segmen akan hilang.

monsterm
sumber
3

Gunakan Kode Ini di mana pun di kelas atau perpustakaan

    $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
sumber
1

Segmen terakhir URL akan selalu menjadi tindakan. Tolong seperti ini:

$this->uri->segment('last_segment');
PrakashG
sumber
-1
$this->router->fetch_class(); 

// fecth kelas kelas dalam kontroler $ this-> router-> fetch_method ();

// metode

Fel
sumber
-4

kelas pengontrol tidak menjalankan fungsi apa pun.

jadi saya sarankan untuk Anda menggunakan script berikut

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
sumber
Ada fungsi standar yang tersedia seperti $ this-> router-> fetch_class () dan fetch_method () maka kita tidak perlu melakukannya secara manual.
Naveed Ramzan