請問thinkphp 怎麼在每個方法裡面判斷是否登入?

來源:互聯網
上載者:User
[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");    }}

問題:

  • 為什麼繼承CommonController.class.php的類也不能再__construct裡面判斷呢?

  • 繼承CommonController.class.php的類如果都要判斷是否登入,就需要在每一個方法裡面寫parent::isLogin();,這樣做合理嗎?還是說這樣做本來就是合理的?

回複內容:

[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");    }}

問題:

  • 為什麼繼承CommonController.class.php的類也不能再__construct裡面判斷呢?

  • 繼承CommonController.class.php的類如果都要判斷是否登入,就需要在每一個方法裡面寫parent::isLogin();,這樣做合理嗎?還是說這樣做本來就是合理的?

    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控制器不繼承,公用控制器只判斷,不寫登陸,不就好了嗎?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.