ThinkPHP(十一)验证:使用构造函数验证(继承)

验证

加入登录功能的目的,是为了我们可以进行权限控制,比如说没有登录我们系统的用户,将不能使用我们的系统。
本章中,我们将分别使用三种方法来实现这个功能。
在实际的项目中,我们使用的是第三种方法,而对验证的维护,通常由小组长或是项目负责人来完成。

一、action中加入验证

我们在“教师管理”中的index action中加入控制语句:如果用户没有登录,则跳转至登录页面;如果用户登录了,则继续浏览。
在这里插入图片描述

1.直接c层验证

<?php
namespace app\index\controller;     // 该文件的位于application\index\controller文件夹
use think\Controller;               // 用于与V层进行数据传递
use think\Request;                  // 引用Request
use app\common\model\Teacher;       // 教师模型

/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
class TeacherController extends Controller
{
    public function index()
    {
        //验证是否登录
        $teacherId=session('teacherId');
        if(is_null($teacherId)){
            return $this->error('请先登录',url('login/index'));
        }
...

未登录访问:http://tp5/index.php/index/teacher/index.html

提示:请先登录,再跳转回登录页

2.代码分层

C层

<?php
namespace app\index\controller;     // 该文件的位于application\index\controller文件夹
use think\Controller;               // 用于与V层进行数据传递
use think\Request;                  // 引用Request
use app\common\model\Teacher;       // 教师模型

/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
class TeacherController extends Controller
{
    public function index()
    {

        // 如果未登录则跳转
        if(!Teacher::isLogin()){
            return $this->error('请先登录',url('login/index'));
        }
...

M层

<?php
// 简单的原理重复记: namespace说明了该文件位于application\common\model 文件夹
namespace app\common\model;
use think\Model;    //  导入think\Model类
/**
 * Teacher 教师表
 */
  
// 我的类名叫做Teacher,对应的文件名为Teacher.php.该类继承了Model类,Model我们在文件头中,提前使用use进行了导入
class Teacher extends Model
{
...
 /**
     * 判断是否登录
     * @return  bool true==登录
     */
    static public function isLogin()
    {
    	$teacherId=session('teacherId');
    	// isset()和is_null()是一对反义词
    	if(isset($teacherId)){
    		return true;
    	}else{
    		return false;
    	}
    }

...

当然了,我们仍然可以在其它action的起始的几行中,添加这么几行代码,来实现验证用户是否登录。如果这样做的话,显然,我们需要写太多重复的代码。这与我们前面讲过的,尽量不去写重复的代码的原则相背。

二、使用构造函数验证(继承)【推荐方法】

1、删除Teacher类中的构造函数;

原控制类直接继承自think\controller
在这里插入图片描述
新:验证类先继承think\controller——然后其它类继承此类——实现最简洁验证
在这里插入图片描述

2、Teacher类由继承于think\Controller改为继承于IndexController;

<?php
namespace app\index\controller;
use app\common\model\Teacher;  // 教师模型
use think\Request;      // 请求
// use think\Controller; 【0】删除
/**
 * 教师管理,继承think\Controller后,就可以利用V层对数据进行打包了。
 */
 /1】此处改为从indexController继承,因为它们在同一命名空间,不用引入
class TeacherController extends IndexController
{
...

3、在IndexController中新建构造函数,进行用户是否登录的判断。

在 application\index\controller\indexController.php 中续写think\controller类的构造函数

<?php
namespace app\index\controller;     //命名空间,也说明了文件所在的文件夹
use think\Controller; /0】引入控制类
use app\common\model\Teacher;      // 引入教师
/**
 * IndexController既是类名,也是文件名,说明这个文件的名字为Index.php。
 * 由于其子类需要使用think\Controller中的函数,所以在此必须进行继承,并在构造函数中,进行父类构造函数的初始化
 */
 /1】继承自controller
class IndexController extends Controller
{

	/2】构造开始
    public function __construct()
    {
        /3】调用父类构造函数(必须),相当于续写父类构造函数,而不是覆盖它
        parent::__construct();

        /4】验证用户是否登陆
        if (!Teacher::isLogin()) {
            return $this->error('plz login first', url('Login/index'));
        }
    }

    public function index()
    {
    }
}

这样只要继承了当前类的子类,如果没登录,都将直接跳转回登录页面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值