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', 
  '...'=>'...'
)

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();

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.


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;


11

Sebagai tambahan

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

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


3

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


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

1

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

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

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

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

// metode


-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];
}

Ada fungsi standar yang tersedia seperti $ this-> router-> fetch_class () dan fetch_method () maka kita tidak perlu melakukannya secara manual.
Naveed Ramzan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.