Heim >Backend-Entwicklung >PHP-Tutorial >Wie bestimmt thinkphp, ob bei jeder Methode eine Anmeldung erfolgen soll?
[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
<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?
[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
<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
Dann erbt jeder Controller dieses Common, außer natürlich Ihr Login-Controller, der den Controller unter Think
erbtDas ist es, Sie können es ausprobieren
Der Login-Controller erbt nicht. Der öffentliche Controller bestimmt nur die Anmeldung und schreibt sie nicht.