CodeIgniter: Cách nhận thông tin về Trình điều khiển, Hành động, URL


124

Tôi có các URL này:

Cách nhận tên bộ điều khiển, tên hành động từ các URL này. Tôi là người mới chơi CodeIgniter. Có bất kỳ chức năng trợ giúp để có được thông tin này

Ví dụ:

$params = helper_function( current_url() )

Nơi $paramstrở thành một cái gì đó như

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

Câu trả lời:


217

Bạn có thể sử dụng Lớp URI :

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

Tôi cũng đã được thông báo rằng các công việc sau đây, nhưng hiện không thể kiểm tra:

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

bởi vì bộ điều khiển của tôi có thư mục con, vì vậy $ this-> uri-> phân đoạn (1) tên bộ điều khiển trả về có thể không chính xác. Cảm ơn sự giúp đỡ của bạn, tôi sử dụng $ this-> bộ định tuyến để nhận thông tin.
noname.cs

2
Để nhận được Thư mục chính xác, bạn cũng có thể sử dụng: $ this-> bộ định tuyến-> fetch_directory ();
jmserra

6
Xin chào, nếu bạn đang sử dụng Codeigniter 3, thì đối với Trình điều khiển, hãy sử dụng: $ this-> router-> class; cho Phương thức: $ this-> bộ định tuyến-> phương thức; cho Thư mục: $ this-> bộ định tuyến-> thư mục; Tài liệu: codeigniter.com/user_guide/installation/ trên
cartalot

$ this-> bộ định tuyến-> fetch_group (); $ this-> bộ định tuyến-> fetch_method (); nó hoạt động
Dinesh Patra

133

Thay vì sử dụng các phân đoạn URI, bạn nên làm điều này:

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

Bằng cách đó, bạn biết rằng bạn luôn sử dụng các giá trị chính xác ngay cả khi bạn đứng sau một URL được định tuyến, trong một tên miền phụ, v.v.


Tôi vừa phát hiện ra rằng sử dụng phương thức này, bạn không thể có được tên phương thức lớp chính xác khi gọi một khung nhìn như thế nào modules::run('module/controller/action'). Nó chỉ hiển thị thông tin bộ định tuyến của trang được tải. Có cách nào để khắc phục điều này?
Starx

Tuyệt vời! Bất kỳ từ nào về cách an toàn này là? Tức là điều này có thể bị giả mạo?
HellaMad

Đây phải là câu trả lời được chấp nhận - hoặc sử dụng phím tắt: $ this->
router-

1
Không phải nếu bạn thay đổi các tuyến đường trong tệp.php, $this->routertrả về lớp mà mã chạy trong, nhưng không phải là bộ định tuyến thực tế được che dấu bằng ghi đè. Cả hai câu trả lời đều khá hữu ích dựa trên những gì bạn muốn làm.
Tibor Szasz

Những phương pháp này đã được sử dụng $this->router->class, $this->router->methodthay vào đó
Richard

30

Các phương pháp không được chấp nhận.

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

Bạn có thể truy cập các thuộc tính thay thế.

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

Xem hướng dẫn sử dụng codeigniter

Các phương thức định tuyến URI fetch_directory (), fetch_group (), fetch_method ()

Với các thuộc tính CI_Router::$directory, CI_Router::$classCI_Router::$methodcông khai và tương ứng của chúng fetch_*()không còn làm bất cứ điều gì khác để trả lại các thuộc tính - không có ý nghĩa gì để giữ chúng.

Đó là tất cả các phương thức nội bộ, không có giấy tờ, nhưng chúng tôi đã chọn từ chối chúng ngay bây giờ để duy trì khả năng tương thích ngược chỉ trong trường hợp. Nếu một số bạn đã sử dụng chúng, thì bây giờ bạn có thể chỉ cần truy cập các thuộc tính thay thế:

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


11

Ngoài ra

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

Cuộc fetch_module()gọi này không hoạt động với tôi trong CI 2.1.2. Không thể tìm thấy nó trong tệp /system/router.php.
tim peterson

1
@timpeterson, Nó chỉ có sẵn trong thành phần HMVC như được nói trong câu trả lời.
Starx

cảm ơn bạn, bạn đã cứu tôi
Barbz_YHOOL

7

Cập nhật

Câu trả lời đã được thêm vào năm 2015 và các phương pháp sau đây không được chấp nhận

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

Xin chào, bạn nên sử dụng cách tiếp cận sau

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

cho mục đích này nhưng để sử dụng nó, bạn cần mở rộng hook của mình CI_Controllervà nó hoạt động như một bùa mê, bạn không nên sử dụng các phân đoạn uri


3

Nếu bạn sử dụng $ this-> uri-> phân đoạn, nếu các url viết lại quy tắc thay đổi, việc khớp tên phân khúc sẽ bị mất.


3

Sử dụng Mã này bất cứ nơi nào trong lớp hoặc thư viện

    $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

Đoạn cuối của URL sẽ luôn là hành động. Hãy nhận như thế này:

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

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

// fecth lớp lớp trong bộ điều khiển $ this-> bộ định tuyến-> fetch_method ();

// phương pháp


-4

lớp điều khiển không hoạt động bất kỳ chức năng.

Vì vậy, tôi khuyên bạn nên sử dụng các tập lệnh sau

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

Có các hàm được xác định trước có sẵn như $ this-> router-> fetch_group () và fetch_method () thì chúng ta không cần phải làm thủ công.
Naveed Ramzan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.