首頁  >  文章  >  後端開發  >  請問thinkphp 怎麼在每個方法裡面判斷是否登入?

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

WBOY
WBOY原創
2016-08-04 09:20:582302瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn