thinkphp는 각 메소드에 로그인할지 여부를 어떻게 결정합니까?

WBOY
풀어 주다: 2016-08-04 09:20:58
원래의
2302명이 탐색했습니다.

[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>
로그인 후 복사
로그인 후 복사

한 가지 문제는 로그인하지 않은 경우 항상 리디렉션된다는 것입니다. 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>
로그인 후 복사
로그인 후 복사

그런 다음
ArticleController.class.php

과 같이 CommonController를 상속하는 다른 각 파일에 생성자를 추가합니다.
<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{
    function __construct()
    {
        parent::isLogin(); // 这样写会报错,不知道为什么,报错提示如下
    }

    public function dolist()
    {

        $this->show("hallo world");
    }
}</code>
로그인 후 복사
로그인 후 복사

오류 메시지:

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

마지막으로 오류를 피하기 위해 다음과 같이 작성합니다.

<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

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

질문:

  • 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>
로그인 후 복사
로그인 후 복사

한 가지 문제는 로그인하지 않은 경우 항상 리디렉션된다는 것입니다. 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>
로그인 후 복사
로그인 후 복사

그런 다음
ArticleController.class.php

과 같이 CommonController를 상속하는 다른 각 파일에 생성자를 추가합니다.
<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{
    function __construct()
    {
        parent::isLogin(); // 这样写会报错,不知道为什么,报错提示如下
    }

    public function dolist()
    {

        $this->show("hallo world");
    }
}</code>
로그인 후 복사
로그인 후 복사

오류 메시지:

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

마지막으로 오류를 피하기 위해 다음과 같이 작성합니다.

<code><?php
namespace Admin\Controller;

use Think\Controller;

class ArticleController extends CommonController
{

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

질문:

  • 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>
로그인 후 복사

공개 클래스에서는 리디렉션하지 마세요. 공개 클래스는 로그인 여부만 확인하고 true 또는 false를 반환한 다음 반환된 결과에 따라 작동합니다.

프로그램 입구에서 적어주세요

다른 로그인 Guestcontroller를 작성하세요. commonController에서 계속 상속하지 말고 Controller를 직접 상속하세요. 이런 식으로 로그인하거나 로그아웃하기 전에 게스트의 Guestcontroller가 이를 처리합니다. 로그인 후 모든 것은 commonController의 하위 클래스에 의해 처리됩니다.

아이디어
CommonContrller의 __construct에서 로그인 확인을 수행하세요. parent::__construct

가 __construct에 포함되어야 한다는 점을 기억하세요.

그런 다음 Think 아래의 컨트롤러를 상속하는 로그인 컨트롤러를 제외하고 각 컨트롤러는 이 공통을 상속합니다.

그렇습니다. 한번 시도해 보세요

로그인 컨트롤러는 상속을 받지 않고, 퍼블릭 컨트롤러는 로그인만 작성하는 것이 좋지 않나요?

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿