[tp版本3.2.3]
我在Controller裡面寫了一個公共類CommonController.class.php
,寫了一個構造方法來判斷是否登錄,沒登錄就重定向到登陸頁:
<code><?php namespace Admin\Controller; use Think\Controller; class CommonController extends Controller { public function __construct() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新,因为可能出现登录了后过期的情况。 } } }</code>
這樣做有一個問題,就是沒有登入的時候總是會重新導向。報錯127.0.0.1 將您重新導向的次數過多。
於是我改成了
<code>class CommonController extends Controller { public function isLogin() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新 } } }</code>
接著在其它繼承CommonController的檔案每一個都去加一個建構函數,如ArticleController.class.php
<code><?php namespace Admin\Controller; use Think\Controller; class ArticleController extends CommonController { function __construct() { parent::isLogin(); // 这样写会报错,不知道为什么,报错提示如下 } public function dolist() { $this->show("hallo world"); } }</code>
報錯提示:
<code>Call to a member function display() on null 错误位置 FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php LINE: 69</code>
最後這樣寫才不報錯:
<code><?php namespace Admin\Controller; use Think\Controller; class ArticleController extends CommonController { public function dolist() { parent::isLogin(); // 这样写 $this->show("hallo world"); } } </code>
問題:
為什麼繼承CommonController.class.php的類別也不能再__construct裡面判斷呢?
繼承CommonController.class.php的類別如果都要判斷是否登錄,就需要在每一個方法裡面寫parent::isLogin();
,這樣做合理嗎?還是說這樣做本來就是合理的?
[tp版本3.2.3]
我在Controller裡面寫了一個公共類CommonController.class.php
,寫了一個構造方法來判斷是否登錄,沒登錄就重定向到登陸頁:
<code><?php namespace Admin\Controller; use Think\Controller; class CommonController extends Controller { public function __construct() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新,因为可能出现登录了后过期的情况。 } } }</code>
這樣做有一個問題,就是沒有登入的時候總是會重新導向。報錯127.0.0.1 將您重新導向的次數過多。
於是我改成了
<code>class CommonController extends Controller { public function isLogin() { $isLogin = session('islogin'); if (!$isLogin) { $this->redirect('Login/index'); return; } else { session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新 } } }</code>
接著在其它繼承CommonController的檔案每一個都去加一個建構函數,如ArticleController.class.php
<code><?php namespace Admin\Controller; use Think\Controller; class ArticleController extends CommonController { function __construct() { parent::isLogin(); // 这样写会报错,不知道为什么,报错提示如下 } public function dolist() { $this->show("hallo world"); } }</code>
報錯提示:
<code>Call to a member function display() on null 错误位置 FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php LINE: 69</code>
最後這樣寫才不報錯:
<code><?php namespace Admin\Controller; use Think\Controller; class ArticleController extends CommonController { public function dolist() { parent::isLogin(); // 这样写 $this->show("hallo world"); } } </code>
問題:
為什麼繼承CommonController.class.php的類別也不能再__construct裡面判斷呢?
繼承CommonController.class.php的類別如果都要判斷是否登錄,就需要在每一個方法裡面寫parent::isLogin();
,這樣做合理嗎?還是說這樣做本來就是合理的?
<code> 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'); } } </code>
別在公共類別裡重定向,公共類別裡只判斷是不是登陸,回傳true或false,然後根據傳回的結果操作。
你寫在程式入口啊
另外寫一個登陸的Guestcontroller,不要繼續自commonController,直接繼承Controller就行了,這樣未登陸前的或退出登陸由guest的Guestcontroller來處理。登陸後全部由commonController的子類別來處理。
思路
在CommonContrller 的__construct中做登入驗證,記著__construct中一定要parent::__construct
接著每個控制器繼承這個Common,當然除了你的Login控制器,它繼承的是Think 下面的Controller
就這樣,你可以試試
Login控制器不繼承,公用控制器只判斷,不寫登陸,不就好了嗎?