Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bestimmt thinkphp, ob bei jeder Methode eine Anmeldung erfolgen soll?

Wie bestimmt thinkphp, ob bei jeder Methode eine Anmeldung erfolgen soll?

WBOY
WBOYOriginal
2016-08-04 09:20:582302Durchsuche

[tp版本3.2.3]
Ich habe eine öffentliche Klasse CommonController.class.php in Controller und einen Konstruktor geschrieben, um zu bestimmen, ob man sich anmelden soll, und um zur Anmeldeseite umzuleiten, wenn man nicht angemeldet ist:

<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>

Ein Problem dabei ist, dass immer eine Weiterleitung erfolgt, wenn Sie nicht angemeldet sind. Fehler 127.0.0.1 将您重定向的次数过多。
, daher habe ich ihn in

geändert
<code>class CommonController extends Controller
{
    public function isLogin()
    {
        $isLogin = session('islogin');
        if (!$isLogin) {
            $this->redirect('Login/index');
            return;
        } else {
            session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新
        }
    }
}</code>

Fügen Sie dann einen Konstruktor zu jeder der anderen Dateien hinzu, die CommonController erben, z. B.
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>

Fehlermeldung:

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

Schreiben Sie abschließend so, um Fehler zu vermeiden:

<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

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

Frage:

  • Warum können Klassen, die CommonController.class.php erben, nicht in __construct beurteilt werden?

  • Wenn eine Klasse, die CommonController.class.php erbt, bestimmen muss, ob sie sich anmelden soll, muss sie parent::isLogin(); in jede Methode schreiben. Oder ist es von Natur aus sinnvoll, dies zu tun?

Antwortinhalt:

[tp版本3.2.3]
Ich habe eine öffentliche Klasse CommonController.class.php in Controller und einen Konstruktor geschrieben, um zu bestimmen, ob man sich anmelden soll, und um zur Anmeldeseite umzuleiten, wenn man nicht angemeldet ist:

<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>

Ein Problem dabei ist, dass immer eine Weiterleitung erfolgt, wenn Sie nicht angemeldet sind. Fehler 127.0.0.1 将您重定向的次数过多。
, daher habe ich ihn in

geändert
<code>class CommonController extends Controller
{
    public function isLogin()
    {
        $isLogin = session('islogin');
        if (!$isLogin) {
            $this->redirect('Login/index');
            return;
        } else {
            session('islogin', $isLogin); // 如果登录刷新一下?不知道是不是这样去刷新
        }
    }
}</code>

Fügen Sie dann einen Konstruktor zu jeder der anderen Dateien hinzu, die CommonController erben, z. B.
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>

Fehlermeldung:

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

Schreiben Sie abschließend so, um Fehler zu vermeiden:

<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

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

Frage:

  • Warum können Klassen, die CommonController.class.php erben, nicht in __construct beurteilt werden?

  • Wenn eine Klasse, die CommonController.class.php erbt, bestimmen muss, ob sie sich anmelden soll, muss sie parent::isLogin(); in jede Methode schreiben. Oder ist es von Natur aus sinnvoll, dies zu tun?

<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>

Keine Weiterleitung in der öffentlichen Klasse Die öffentliche Klasse bestimmt nur, ob Sie angemeldet sind, gibt true oder false zurück und arbeitet dann basierend auf dem zurückgegebenen Ergebnis.

Sie schreiben es am Programmeingang

Schreiben Sie keinen weiteren Login-Guestcontroller, sondern erben Sie den Controller direkt. Auf diese Weise wird der Guestcontroller des Gastes damit umgehen. Nach der Anmeldung wird alles von Unterklassen von commonController verwaltet.

Idee
Führen Sie eine Anmeldeüberprüfung in __construct von CommonContrller durch. Denken Sie daran, dass parent::__construct

in __construct enthalten sein muss.

Dann erbt jeder Controller dieses Common, außer natürlich Ihr Login-Controller, der den Controller unter Think

erbt

Das ist es, Sie können es ausprobieren

Der Login-Controller erbt nicht. Der öffentliche Controller bestimmt nur die Anmeldung und schreibt sie nicht.

Stellungnahme:
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