### 初始化
[TOC=4,6]
ThinkPHP5提供了更简便的模块初始化操作,在以往的版本您需要首先定义一个本控制器的父类,然后在父类中定义初始化操作,而现在,您只需要在模块的当前控制器中写一个初始化的方法,就可以完成初始化操作了。具体到我们的项目,我们需要在学生模块的每个界面均显示学生的信息。所以这个操作可以交给模块的初始化方法来完成。
>[warning] 无论访问该控制器下的哪个方法,都会首先运行初始化方法。
学生模块的所有控制器方法都位于 application/index/controller/student.php文件中,其初始化控方法代码如下:
#### 初始化代码
~~~
namespace app\index\controller;
use think\Controller;
use app\model\Student as StuModel;
use app\model\Task as TaskModel;
use app\model\Submit as SubmitModel;
use think\Request;//用于Session读取
use think\Session;
class Student extends Controller{
public function _initialize()
{
$request=$this->request;
//初始化的时候检查 用户权限
if(null==$request->session('stuno')||$request->session('stuno')=='')
{
$this->error("您没有该页的访问权限!",url('./account/login'));
exit;
}else
{
$stuno=$request->session('stuno');
$stu=StuModel::get(['stu_no'=>$stuno]);
$this->stuid=$stu['stu_id'];
$this->new_task_number=$stu['new_task_number'];
$this->assign('stuid',$stu['stu_id']);
$this->assign('stuno',$stu['stu_no']);
$this->assign('stuname',$stu['stu_name']);
//左侧默认无active菜单
$this->assign('index','');
$this->assign('newtasks','');
$this->assign('account','');
$this->assign('num',$this->new_task_number);
}
}
~~~
#### 代码分析
1、检查用户权限,拒绝非法登录
当用户通过登录界面登录系统后会在Session中存放响应的用户身份标识,在初始化程序中要检测相应的标识是否存在。
>[warning] 在ThinkPHP以前的版本中,可以通过$_SESSION直接操作Session变量,而在ThinkPHP5中为了安全起见将Session封装在了请求对象Request中,所以需要通过实例化Request来操作Session。更过关于Session的用法请参看官方教程。
2、给模板参数复制
前面讲到过,Student模块会用到视图模板,模板变量的变量是需要在初始化的时候进行赋值的,比如学生的信息和未完成作业的数量。还需要将菜单的选中状态都设置为未选中。设置模板参数中学生信息的过程如下:
(1)通过Session中保存的学号信息查询学生
(2)将学生的相关信息赋值给模板视图变量。
这样,无论我们访问学生模板的任何方法,都会在视图中显示学生的信息,如下图所示:
![](https://box.kancloud.cn/ef515b21cde0444851be1b43acc700e3_299x208.png)
(ps:这里的头像我们使用了默认的头像,当然也可以在账户设置中添加上传头像的功能,将图片路径保存到Student中即可)
>[info] 模板中的视图变量往往在整个模块中都有效,所以最适合在初始化方法中赋值。