PHP经验分享

《Thinkphp5入门系列课程》第七课:Controller学

2017-09-11  本文已影响392人  6aec4f6b9d46

Thinkphp5视频教程

通过本文你可以学习到:

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 学习(二)。
喜欢的给个订阅呗!
由于作者水平有限,如有错误请欢迎指正。

上一篇下一篇

猜你喜欢

热点阅读