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

WBOY
Freigeben: 2016-08-04 09:20:58
Original
2251 Leute haben es durchsucht

[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>
Nach dem Login kopieren
Nach dem Login kopieren

这样做有一个问题,就是没有登录的时候始终会重定向。报错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>
Nach dem Login kopieren
Nach dem Login kopieren

接着在其它继承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>
Nach dem Login kopieren
Nach dem Login kopieren

报错提示:

<code>Call to a member function display() on null
错误位置
FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php  LINE: 69</code>
Nach dem Login kopieren
Nach dem Login kopieren

最后这样写才不报错:

<code><?php namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

    public function dolist()
    {
        parent::isLogin(); // 这样写
        $this->show("hallo world");
    }
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

问题:

  • 为什么继承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>
Nach dem Login kopieren
Nach dem Login kopieren

这样做有一个问题,就是没有登录的时候始终会重定向。报错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>
Nach dem Login kopieren
Nach dem Login kopieren

接着在其它继承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>
Nach dem Login kopieren
Nach dem Login kopieren

报错提示:

<code>Call to a member function display() on null
错误位置
FILE: X:\domainX\ThinkPHP\Library\Think\Controller.class.php  LINE: 69</code>
Nach dem Login kopieren
Nach dem Login kopieren

最后这样写才不报错:

<code><?php namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

    public function dolist()
    {
        parent::isLogin(); // 这样写
        $this->show("hallo world");
    }
}
</code>
Nach dem Login kopieren
Nach dem Login kopieren

问题:

  • 为什么继承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>
Nach dem Login kopieren

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

你写在程序入口啊

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

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

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

就这样,你可以试试

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!