《Thinkphp5入门系列课程》第七课:Controller学习(二)

2017-09-13 10:26:08来源:http://www.jianshu.com/p/40d786a6512d作者:小滕Tt人点击

分享

通过本文你可以学习到:



controller 的前置操作
controller 的前置操作

今天给大家说一说 controller 的前置操作,也是 controller 课程的最后一篇文章。本着入门系列的课程宗旨:只说常用的。所以诸如空操作,空控制器,多级控制器等就不说了,不常用,如果你有需求自己看下文档就可以啦。那为什么把前置操作单独拎出来讲解呢?哈哈,因为一篇文章将 controller 讲完就太长了,本着快速学习的目的,还是分拆开来较好,我想看到一篇几千字的文章你也看不下去咯。


前置操作,顾名思义,就是在某个方法执行之前执行一些其他操作。thinkphp5controller 有一个 beforeActionList 属性,该属性结构如下:


$beforeActionList = [
'beforeMethod1',
'beforeMethod2' => [
'only' => 'action1,action2',
],
'beforeMethod3' => [
'except' => 'action3,action2',
],
];

beforeMethod1,beforeMethod2,beforeMethod3 是该 controller 下面的 protectedprivate 修饰的前置操作(也就是无法通过 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 学习(二)。
喜欢的给个订阅呗!
由于作者水平有限,如有错误请欢迎指正。




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台