《Thinkphp5入门系列课程》第七课:Controller学
通过本文你可以学习到:
-
controller
的前置操作
controller 的前置操作
今天给大家说一说 controller
的前置操作,也是 controller
课程的最后一篇文章。本着入门系列的课程宗旨:只说常用的。所以诸如空操作,空控制器,多级控制器等就不说了,不常用,如果你有需求自己看下文档就可以啦。那为什么把前置操作单独拎出来讲解呢?哈哈,因为一篇文章将 controller
讲完就太长了,本着快速学习的目的,还是分拆开来较好,我想看到一篇几千字的文章你也看不下去咯。
前置操作,顾名思义,就是在某个方法执行之前执行一些其他操作。thinkphp5
的 controller
有一个 beforeActionList
属性,该属性结构如下:
$beforeActionList = [
'beforeMethod1',
'beforeMethod2' => [
'only' => 'action1,action2',
],
'beforeMethod3' => [
'except' => 'action3,action2',
],
];
beforeMethod1
,beforeMethod2
,beforeMethod3
是该 controller
下面的 protected
或 private
修饰的前置操作(也就是无法通过 url
访问的方法)的方法名。然后呢,用这些方法名做为数组的键名,键值它有三种情况:不指定键值,指定键值(使用 only
),指定键值(使用 except
),下面详细分析下这三种方法:
情况 | 说明 |
---|---|
不指定键值 | 访问该 controller 下面的方法的时候都会执行该方法 |
指定键值(使用 only ) |
访问该 controller 的时候当前的 action 需要在 only 里面有指定方可执行 |
指定键值(使用 except ) |
访问该 controller 的时候当前的 action 不存在 except 中方可执行 |
下面看具体实例:
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
protected $beforeActionList = [
'beforeHello',
'beforeWorld' => [
'only' => 'index,save',
],
'beforeHeihei' => [
'except' => 'index',
],
];
protected function beforeHello ()
{
echo 'hello';
}
protected function beforeWorld ()
{
echo 'world';
}
protected function beforeHeihei ()
{
echo 'heihei';
}
public function index()
{
echo 'index';
}
public function add ()
{
echo 'adds';
}
public function save()
{
echo 'save';
}
}
现在我们来分析下, beforeHello
是未指定键值,所以访问每个 action
都会先执行这个方法; beforeWorld
指定了 only
,所以只有访问 index
或者 save
的时候执行该方法; beforeHeihei
制定了 except
,也就排除了 index
方法,那么访问除 index
之外的其他方法都执行 beforeHeihei
。下面看下结果:
访问:/index/index
:
helloworldindex
访问:/index/index/add
:
helloheiheiadds
访问:/index/index/save
:
helloworldheiheisave
结果与我们分析的一样。
controller 前置操作的实际应用
实际开发中,可能一个 controller
需要做部分登陆检测,当然这个可以在 behavior
里面完成,但是,今天我们利用 controller
的前置操作完成部分 action
的登陆操作。先看代码:
<?php
namespace app\index\controller;
use think\Controller;
use think\Request;
class Api extends Controller
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
//
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
项目要求: create
, save
, edit
, update
,delete
需要验证用户是否登陆,另外 save
,update
,delete
需要验证用户是否具有权限操作。需求分析后,代码应该是这样的(下面代码只是方便阅读,并不能运行,因为我没有实现 User
实例,且 thinkphp5
当前版本不具有服务容器(5.1添加)):
下面代码仅做参考:
<?php
namespace app\index\controller;
use think\Request;
use think\Controller;
class Api extends Controller
{
protected $beforeActionList = [
'checkLogin' => [
'only' => 'create,save,edit,update,delete',
],
'checkAuth' => [
'only' => 'save,update,delete',
],
];
/**
* 检测是否登录
*/
protected function checkLogin (User $user)
{
if (!$user->isLogin()) {
throw new Exception("Please login before do something.", 401);
}
}
/**
* 检测是否拥有权限
*/
protected function checkAuth (User $user)
{
if (!$user->can()) {
throw new Exception("Ban.", 403);
}
}
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
//
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
教程就到这里啦。此篇是小滕的《Thinkphp5入门系列课程》第七课:Contorller 学习(二)。
喜欢的给个订阅呗!
由于作者水平有限,如有错误请欢迎指正。