CodeIgniter: วิธีรับข้อมูล Controller, Action, URL


124

ฉันมี URL เหล่านี้:

วิธีรับชื่อคอนโทรลเลอร์ชื่อการดำเนินการจาก URL เหล่านี้ ฉันเป็นมือใหม่ CodeIgniter มีฟังก์ชั่นตัวช่วยในการรับข้อมูลนี้หรือไม่

Ex:

$params = helper_function( current_url() )

$paramsกลายเป็นสิ่งที่ชอบที่ไหน

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

คำตอบ:


218

คุณสามารถใช้URI Class :

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

ฉันยังได้รับแจ้งว่างานต่อไปนี้ แต่ตอนนี้ยังไม่สามารถทดสอบได้:

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

เนื่องจากคอนโทรลเลอร์ของฉันมีโฟลเดอร์ย่อยดังนั้น $ this-> uri-> segment (1) ส่งคืนชื่อคอนโทรลเลอร์อาจไม่ถูกต้อง ขอบคุณสำหรับความช่วยเหลือฉันใช้ $ this-> router เพื่อรับข้อมูล
noname.cs

2
สำหรับการรับ Directory อย่างถูกต้องคุณสามารถใช้: $ this-> router-> fetch_directory ();
jmserra

6
เฮ้ถ้าคุณใช้ Codeigniter 3 แล้วสำหรับ Controller ใช้: $ this-> router-> class; สำหรับวิธีการ: $ this-> router-> method; สำหรับ Directory: $ this-> router-> directory; เอกสารอ้างอิง: codeigniter.com/user_guide/installation/...
cartalot

$ this-> เราเตอร์> fetch_class (); $ this-> เราเตอร์> fetch_method (); มันได้ผล.
Dinesh Patra

133

แทนที่จะใช้กลุ่ม URI คุณควรทำสิ่งนี้:

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

ด้วยวิธีนี้คุณจะรู้ว่าคุณใช้ค่าที่ถูกต้องอยู่เสมอแม้ว่าคุณจะอยู่หลัง URL ที่กำหนดเส้นทางในโดเมนย่อย ฯลฯ


modules::run('module/controller/action')ฉันเพิ่งค้นพบว่าการใช้วิธีนี้คุณจะไม่สามารถได้รับชื่อของวิธีการเรียนที่ถูกต้องเมื่อเรียกมุมมองเหมือน มันแสดงข้อมูลเราเตอร์ของหน้าที่โหลด มีวิธีใดบ้างที่จะเอาชนะสิ่งนี้?
Starx

! น่ากลัว คำว่าความปลอดภัยนี้คืออะไร? เช่นนี้สามารถสวมรอยได้หรือไม่?
HellaMad

นี่ควรเป็นคำตอบที่ยอมรับ - หรือใช้ทางลัด: $ this->
router-

1
ไม่ใช่ถ้าคุณเปลี่ยนเส้นทางใน route.php ให้$this->routerส่งคืนคลาสที่โค้ดทำงาน แต่ไม่ใช่เราเตอร์จริงที่มาสก์ด้วยการแทนที่ คำตอบทั้งสองมีประโยชน์มากสำหรับสิ่งที่คุณต้องการทำ
Tibor Szasz

วิธีการเหล่านี้ได้รับการ depricated ใช้$this->router->classและ $this->router->methodแทน
ริชาร์ด

30

วิธีนี้เลิกใช้แล้ว

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

คุณสามารถเข้าถึงคุณสมบัติแทนได้

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

ดูคู่มือผู้ใช้ codeigniter

วิธีการกำหนดเส้นทาง URI fetch_directory (), fetch_class (), fetch_method ()

ที่มีคุณสมบัติCI_Router::$directory, CI_Router::$classและ CI_Router::$methodเป็นของประชาชนและของตนfetch_*()ไม่มีอะไรอีกต่อไปทำอย่างอื่นที่จะเพียงแค่กลับคุณสมบัติ - มันไม่ได้ทำให้ความรู้สึกที่จะให้พวกเขา

วิธีเหล่านี้เป็นวิธีการภายในที่ไม่มีเอกสาร แต่เราเลือกที่จะเลิกใช้งานในตอนนี้เพื่อรักษาความเข้ากันได้แบบย้อนกลับไว้ในกรณีนี้ หากคุณบางคนใช้ประโยชน์จากสิ่งเหล่านี้คุณสามารถเข้าถึงคุณสมบัติแทนได้:

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


11

นอกจากนี้

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

การfetch_module()โทรนี้ใช้ไม่ได้สำหรับฉันใน CI 2.1.2 ไม่พบในไฟล์ /system/router.php
tim peterson

1
@timpeterson มีเฉพาะในองค์ประกอบ HMVC ตามที่ระบุในคำตอบ
Starx

ขอบคุณคุณช่วยฉันไว้
Barbz_YHOOL

7

ปรับปรุง

คำตอบถูกเพิ่มเข้ามาในปี 2015 และตอนนี้เลิกใช้วิธีการต่อไปนี้แล้ว

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

สวัสดีคุณควรใช้แนวทางต่อไปนี้

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

เพื่อจุดประสงค์นี้ แต่สำหรับการใช้สิ่งนี้คุณต้องขยายตะขอของคุณจากCI_Controllerและมันใช้งานได้เหมือนมีเสน่ห์คุณไม่ควรใช้ส่วน uri


3

หากคุณใช้ $ this-> uri-> เซ็กเมนต์หากเปลี่ยนกฎการเขียน URL ใหม่การจับคู่ชื่อเซ็กเมนต์จะหายไป


3

ใช้รหัสนี้ที่ใดก็ได้ในชั้นเรียนหรือห้องสมุด

    $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

ส่วนสุดท้ายของ URL จะเป็นการดำเนินการเสมอ กรุณารับสิ่งนี้:

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


-4

คลาสคอนโทรลเลอร์ไม่ทำงานใด ๆ

ดังนั้นฉันขอแนะนำให้คุณใช้สคริปต์ต่อไปนี้

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

มีฟังก์ชันที่กำหนดไว้ล่วงหน้าเช่น $ this-> router-> fetch_class () และ fetch_method () ดังนั้นเราไม่จำเป็นต้องทำด้วยตนเอง
Naveed Ramzan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.