在Codeigniter中,所有的請求一般都對應於一個Controller中的函數,如果對於不同的請求,如ajax和普通請求,返回的東西一般都會不一樣如this->load->view 或者直接echo。
兩種方法寫在一起讓我感覺特別不爽,我設想了一種方案就是使用Http頭中的Accept,如何產生一種方式,就是在一個函數中,不同的請求輸出不同的view樣式,比如ajax請求這個函數,就返回json格式,普通請求,就返回HTML。請問我想要這樣的效果,怎麼做才好。
回複內容:
在Codeigniter中,所有的請求一般都對應於一個Controller中的函數,如果對於不同的請求,如ajax和普通請求,返回的東西一般都會不一樣如this->load->view 或者直接echo。
兩種方法寫在一起讓我感覺特別不爽,我設想了一種方案就是使用Http頭中的Accept,如何產生一種方式,就是在一個函數中,不同的請求輸出不同的view樣式,比如ajax請求這個函數,就返回json格式,普通請求,就返回HTML。請問我想要這樣的效果,怎麼做才好。
ajax 請求一盤只管返回 json 資料,不會直接給 HTML 的,而 view 是直接 include 的 view,原理不一樣吧,如果你非要這麼種,那麼自訂一下 view 方法即可:
public function loadView($view, $data) { if( $this->input->is_ajax_request() ) { echo $this->load->view($view, $data, TRUE); exit; } // 如果是 ajax 不會執行到這裡 $this->load-
以後你載入 view 時,使用 $this->loadView($viewName, $data) 而不再使用 $this->load->view(); 即可,這個 loadView 方法你可以寫在父 Contrller 裡面,這隻是思路,你可以按需求來定製!
在CodeIgniter的輸入類中已經提供了is_ajax_request()方法來判斷是否為ajax請求了,可以用$this->input->is_ajax_request()的形式來調用。
參見http://codeigniter.org.cn/user_guide/libraries/input.html。
首先,根據“單一職能原則”,是不建議你這樣設計一個功能的。你可以把主要功能封裝成一個可調用的方法,然後在不同的controller裡面分別調用這個方法來處理。另外,json也是view的一種展現形式,所以你完全可以把資料都傳進view裡面,只是兩個view不同在於,一個是HTML展示,一個是json展示
為什麼不在請求中添加一個請求參數來區分終端呢?
實在不行用UA也能區分的吧。
define('ISAJAX', isset($SERVER['HTTPXREQUESTEDWITH']) && strtolower($SERVER['HTTPXREQUESTED_WITH']) == 'xmlhttprequest');
判斷的時候這樣if(IS_AJAX) { 。。。}else { 。。。}