请问thinkphp 怎么在每个方法里面判断是否登录?

WBOY
Libérer: 2016-08-04 09:20:58
original
2302 Les gens l'ont consulté

[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>
Copier après la connexion
Copier après la connexion

这样做有一个问题,就是没有登录的时候始终会重定向。报错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>
Copier après la connexion
Copier après la connexion

接着在其它继承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>
Copier après la connexion
Copier après la connexion

报错提示:

<code>Call to a member function display() on null
错误位置
FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php  LINE: 69</code>
Copier après la connexion
Copier après la connexion

最后这样写才不报错:

<code><?php namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

    public function dolist()
    {
        parent::isLogin(); // 这样写
        $this->show("hallo world");
    }
}
</code>
Copier après la connexion
Copier après la connexion

问题:

  • 为什么继承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>
Copier après la connexion
Copier après la connexion

这样做有一个问题,就是没有登录的时候始终会重定向。报错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>
Copier après la connexion
Copier après la connexion

接着在其它继承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>
Copier après la connexion
Copier après la connexion

报错提示:

<code>Call to a member function display() on null
错误位置
FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php  LINE: 69</code>
Copier après la connexion
Copier après la connexion

最后这样写才不报错:

<code><?php namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

    public function dolist()
    {
        parent::isLogin(); // 这样写
        $this->show("hallo world");
    }
}
</code>
Copier après la connexion
Copier après la connexion

问题:

  • 为什么继承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>
Copier après la connexion

别在公共类里重定向,公共类里只判断是不是登陆,返回true或false,然后根据返回的结果操作。

你写在程序入口啊

另外写一个登陆的Guestcontroller,不要继续自commonController,直接继承Controller就行了,这样未登陆前的或退出登陆由guest的Guestcontroller来处理。登陆后全部由commonController的子类来处理。

思路
在CommonContrller 的__construct中做登录验证,记着__construct中一定要parent::__construct

然后每个控制器继承这个Common,当然除了你的Login控制器,它继承的是Think 下面的Controller

就这样,你可以试试

Login控制器不继承,公用控制器只判断,不写登陆,不就好了吗?

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal