2010-04-11 28 views
17

我有一個需要登錄的幾頁,讓鏈接到這些網頁上的所有控制器,PHP /笨 - 利用出口()

$this->checkSession(); 
//...rest of the code 

CheckSession應驗證會話仍然生活開始,否則顯示消息並停止執行控制器中的其餘代碼:

function checkSession() 
{ 
    if (!$this->session->userdata('is_logged_in')) 
    { 
     //the session has expired! 
     $data['main'] = 'confirmation_message'; 
     $data['title'] = "Session expired"; 
     $this->load->vars($data); 
     $this->load->view('template'); 
     exit(); 
    } 
} 

。 我曾期待這些指示順序發生,但我只能看到空白頁。 如何確保只有在加載所有視圖後才執行exit()?

+0

是否有某些原因需要調用exit()? – 2010-04-12 02:27:42

回答

14

在這種情況下,你不應該使用退出,如果會話是無效的,你應該做的是重定向你的應用程序中使用例如:

redirect('/init/login/','refresh'); 
+0

如果我想從同一頁面顯示loing,該怎麼辦?並在用戶登錄後使用(AJAX)頁面將刷新 – MJoraid 2014-08-12 22:17:00

+0

@Joraid檢查其他答案之一,這取決於你的會徽必然有一個答案 – DarkMukke 2015-08-03 16:26:25

+0

這個答案的作品,但如果你正在嘗試重構一個構造函數而重定向頁面在同一個控制器上,那麼你可能會在無限的重定向中結束...... !!最好的答案是Sam&@evilunix – 2016-10-30 14:29:54

2

我對codeigniter的工作流程不夠了解,但在我看來,您希望重定向到登錄頁面而不是嘗試呈現它。很明顯,在調用exit()時,您提供的代碼都不會將模板發送到瀏覽器。

2

exit()在那裏切斷你的腳本,並且控制器的實際_output()函數永遠不會被調用。您需要做的是在您的一個控制器中添加操作,例如用戶登錄屏幕並在那裏重定向。您可以使用會話中的flashdata函數 - http://codeigniter.com/user_guide/libraries/sessions.html傳遞您的消息,然後將其捕捉到視圖中並顯示它。

另一種非常智能但應該工作的方式是強制調用輸出函數。

function checkSession() 
{ 
    if (!$this->session->userdata('is_logged_in')) 
    { 
     //the session has expired! 
     $data['main'] = 'confirmation_message'; 
     $data['title'] = "Session expired"; 
     $this->load->vars($data); 
     $this->load->view('template'); 
     $this->_output(); 
     exit(); 
    } 
} 
15

在這種情況下,佩德羅是正確的。如果他們沒有登錄只是重定向他們,如果你可以使用Public/Admin named base controllers來阻止你在每個單獨的受保護文件中這樣做,那更好。

一般來說,如果你使用exit(),它會停止輸出庫的運行。如果你只是想停止當前的控制器執行,但允許輸出控制器,你可以使用完全相同的方式返回。

function checkSession() 
{ 
    return (bool) $this->session->userdata('is_logged_in'); 
} 

然後簡單:

if(!$this->checkSession()) 
{ 
     //the session has expired! 
     $data['main'] = 'confirmation_message'; 
     $data['title'] = "Session expired"; 
     $this->load->vars($data); 
     $this->load->view('template'); 
     return; 
} 

退出()應該永遠只能使用,如果你真的想你的應用程序的執行進行調試,錯誤報告等在

+0

似乎是一個很好的解決方案,儘管我仍然是一名初學者 - 當我對CI有更好的把握時,我會繼續關注它。 – Patrick 2010-04-12 13:59:09

+0

很好的答案。我第一次意識到exit()和return之間的區別。 – 2010-05-28 09:28:06

+0

注意:如果代碼位於構造函數()中,則不會返回,因此index()也將被調用。 – MJoraid 2014-08-12 22:18:41

2

實際上的瞬間死亡最新的CI功能手動呼叫輸出類是

$this->display->_output(); 

並不要擔心 - 它韓dles緩存,內容也將被正確gzipped,如果你設置如此在配置

我通常添加和擴展控制器登錄邏輯處理登錄功能,以便如果一個正常的控制器是需要身份驗證,然後登錄方法被自動調用並且原始內容不顯示。這是一個很好的解決方案,如果你想留在用戶試圖訪問的頁面上而不重定向(然後將他張貼回同一頁面)

+6

我認爲這是錯誤的方式... $ this-> output - > _ display(); – 2012-07-20 01:13:11

+0

downvoted,直到語法正確 – DarkMukke 2015-08-03 16:27:01

12

我有類似的問題。由於沒有登錄,我想停止用戶。但我想爲他們提供一個鏈接列表,而不是簡單地將它們重定向到登錄頁面。我正在使用CI版本1.7.2,並且$ this - > _ output()$ this-> display - > _ output()和$ this-> output - > _ display()解決方案對我無效。然而,我使用$ this-> output-> get_output()函數得到了我的結果。

 $this->load->vars($data); 
     $this->load->view('template'); 
     die($this->output->get_output()); 
+1

此解決方案爲我工作。謝謝! – machineaddict 2013-03-11 11:05:53

8
$this->output->_display(); 
exit(); 

是正確的答案!感謝Sam Sehnert ......它隱藏在評論中,所以我想重新發布。

+0

這很好,我認爲這是正確的答案。 – 2015-09-05 04:39:38

1

把代碼放在一個變量中並寫下來。

$html = $this->load->view('template',null,true); 
echo $html; 
exit();