美文网首页PHP经验分享
《Thinkphp5入门系列课程》第七课:Controller学

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

作者: 6aec4f6b9d46 | 来源:发表于2017-09-11 15:19 被阅读392次

    Thinkphp5视频教程

    通过本文你可以学习到:

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

    相关文章

      网友评论

        本文标题:《Thinkphp5入门系列课程》第七课:Controller学

        本文链接:https://www.haomeiwen.com/subject/ewaxsxtx.html