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

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-08-04 09:20:58
Original
2377 Leute haben es durchsucht

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

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

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

Fehlermeldung:

<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

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

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

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

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

Fehlermeldung:

<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

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

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

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.

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
Aktuelle Ausgaben
ThinkPHP Warum Composer verwenden?
Aus 1970-01-01 08:00:00
0
0
0
thinkphp-Dateien hochladen
Aus 1970-01-01 08:00:00
0
0
0
Wie nennt Thinkphp PHP-Erweiterungen?
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage