[tp版本3.2.3]
我在Controller裡面寫了一個公用類
CommonController.class.php,寫了一個構造方法來判斷是否登入,沒登入就重新導向到登陸頁:
redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登入重新整理一下?不知道是不是這樣去重新整理,因為可能出現登入了後到期的情況。 } }}
這樣做有一個問題,就是沒有登入的時候始終會重新導向。報錯127.0.0.1 將您重新導向的次數過多。
於是我改成了
class CommonController extends Controller{ public function isLogin() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登入重新整理一下?不知道是不是這樣去重新整理 } }}
接著在其它繼承CommonController的檔案每一個都去加一個建構函式,如
ArticleController.class.php
show("hallo world"); }}
報錯提示:
Call to a member function display() on null錯誤位置FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php LINE: 69
最後這樣寫才不報錯:
show("hallo world"); }}
問題:
回複內容:
[tp版本3.2.3]
我在Controller裡面寫了一個公用類CommonController.class.php,寫了一個構造方法來判斷是否登入,沒登入就重新導向到登陸頁:
redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登入重新整理一下?不知道是不是這樣去重新整理,因為可能出現登入了後到期的情況。 } }}
這樣做有一個問題,就是沒有登入的時候始終會重新導向。報錯127.0.0.1 將您重新導向的次數過多。
於是我改成了
class CommonController extends Controller{ public function isLogin() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登入重新整理一下?不知道是不是這樣去重新整理 } }}
接著在其它繼承CommonController的檔案每一個都去加一個建構函式,如
ArticleController.class.php
show("hallo world"); }}
報錯提示:
Call to a member function display() on null錯誤位置FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php LINE: 69
最後這樣寫才不報錯:
show("hallo world"); }}
問題:
public function _initialize() { $allow_actions = explode(',',C('ALLOW_ACTIONS')); //配置哪些操作無需登入即可訪問,比如登入,驗證登入 $curr_action = MODULE_NAME . '.' . CONTROLLER_NAME . '.' . ACTION_NAME; if(!in_array($curr_action,$allow_actions) && !is_login_admin()) { //未登入且是需要登入後訪問的 $this->redirect('Admin/Public/login'); } }
別在公用類裡重新導向,公用類裡只判斷是不是登陸,返回true或false,然後根據返回的結果操作。
你寫在程式入口啊
另外寫一個登陸的Guestcontroller,不要繼續自commonController,直接繼承Controller就行了,這樣未登陸前的或退出登陸由guest的Guestcontroller來處理。登陸後全部由commonController的子類來處理。
思路
在CommonContrller 的__construct中做登入驗證,記著__construct中一定要parent::__construct
然後每個控制器繼承這個Common,當然除了你的Login控制器,它繼承的是Think 下面的Controller
就這樣,你可以試試
Login控制器不繼承,公用控制器只判斷,不寫登陸,不就好了嗎?