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.