• ThinkPHP5.1 行为与钩子


    文件目录

    闭包方式调用钩子

    闭包传参调用

    行为钩子绑定

    行为钩子绑定传参

    tage 文件统一定义行为

    直接执行行为

    行为变量模板赋值

    模板中调用钩子

    最后总结

    文件目录

    闭包方式调用钩子

    applicationpub ags.php

    return [
        //接口初始化
        'app_init'      => ['app\pub\behavior\Upfile'],
    ];

    控制器文件: applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            // 可以不用定义行为直接把闭包函数绑定到某个标签位
            Hook::add('app_init',function(){
                echo '闭包调用';
            });
            hook::listen('app_init');
        }
    }

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑
        public function run()
        {
            echo "run 入口";
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit()
        {
           echo "初始化";
        }
    }

    没有 appInt() 方法时,自动调用 run() 方法。

    如果存在 appInt() 方法,只调用appInt() 方法,不调用 run() 方法

    闭包里的数据最后调用。

    闭包传参调用

    applicationpub ags.php 文件同上

    控制器文件: applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            $params = ['username' => 'liaosp'];
            Hook::add('app_init',function($params){
                echo "<br/>".' 闭包输出参数:'.$params['username'];
            });
            Hook::listen('app_init',$params);
        }
    }

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑
        public function run($params)
        {
             echo "run 入口输出参数: ".$params['username'];
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit($params)
        {
            echo '初始化输出参数:'.$params['username'];
        }
    }

     

    行为钩子绑定

    控制器文件:applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            Hook::add('app_init','app\pub\behavior\Upfile'); //手动注册行为 app_init 是注册行为的名称 后面的是行为文件路径
            Hook::listen('app_init');
        }
    }

    行为文件多个用数组表示,如果其中一个行为中有中止代码的话则后续不会执行,如果返回 false 则当前标签位的后续行为将不会执行,但应用将继续运行。

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run()
        public function run()
        {
             echo "run 入口";
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit()
        {
            echo '初始化';
        }
    }

    行为钩子绑定传参

    控制器文件:applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            Hook::add('app_init','app\pub\behavior\Upfile'); //手动注册行为 app_init 是注册行为的名称 后面的是路径
            $param['name']='aaa';
            Hook::listen('app_init',$param);
        }
    }

    行为文件多个用数组表示,如果其中一个行为中有中止代码的话则后续不会执行,如果返回 false 则当前标签位的后续行为将不会执行,但应用将继续运行。

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run()
        public function run($param)
        {
             echo "run 入口:".$param['name'];
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit($param)
        {
            echo '初始化:'.$param['name'];
        }
    }

    tage 文件统一定义行为

    applicationpub ags.php

    return [
        //接口初始化
        'app_init'      => ['app\pub\behavior\Upfile'],
    ];

    一个标签位可以绑定多个行为

    控制器文件:applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            $param['name']='aaa';
            Hook::listen('app_init',$param); // 参数不是必选
        }
    }

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run()
        public function run($param)
        {
             echo "run 入口:".$param['name'];
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit($param)
        {
            echo '初始化:'.$param['name'];
        }
    }

    直接执行行为

    直接执行行为的时候,执行的是run方法

    $param['name']='aaa';
    Hook::exec('app\pub\behavior\Upfile',$param);// 参数不是必传

    如果需要执行行为类的其它方法,可以使用

    $param['name']='aaa';
    Hook::exec(['app\pub\behavior\Upfile','appInit'], $param);// 参数不是必传

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run()
        public function run($param)
        {
             echo "run 入口:".$param['name'];
        }
        //方法名就是钩子名称的驼峰命名(首字母小写)。
        public function appInit($param)
        {
            echo '初始化:'.$param['name'];
        }
    }

    行为变量模板赋值

    控制器文件:applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            $param=array("red","green","blue","yellow","brown");
            $result=Hook::listen('app_init',$param);// 返回数据类型为数组类型
            $this->assign('hook',$result[0]); // 变量传递,模板中调用{$hook}
            return $this->fetch();
        }
    }

    钩子定义: applicationpub ags.php

    return [
        //接口初始化
        'app_init'      => ['app\pub\behavior\Upfile'],
    ];

    一个标签位可以绑定多个行为

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run(),业务处理
        public function run($param)
        {
             return "run 入口:".implode(',',$param);
        }
        //方法名就是钩子名称的驼峰命名(首字母小写),业务处理
        public function appInit($param)
        {
            echo '初始化:'.implode(',',$param);
        }
    }

    模板中调用钩子

    控制器文件:applicationpubcontrollerUpfile.php

    namespace apppubcontroller;
    
    use thinkController;
    use thinkfacadeHook;
    
    class Upfile extends Controller
    {
        public function index(){
            return $this->fetch();
        }
    }

    行为文件:applicationpubehaviorUpfile.php

    namespace apppubehavior;
    
    class Upfile
    {
        // 行为逻辑 如果没有appInit() 方法,自动执行 run(),业务处理
        public function run($param)
        {
             return "run 入口:".implode(',',$param);
        }
        //方法名就是钩子名称的驼峰命名(首字母小写),业务处理
        public function appInit($param)
        {
            echo '初始化:'.implode(',',$param);
        }
    }

    公共函数方法: applicationcommon.php

    function hook($hook,$params=array()){
        	hinkfacadeHook::listen($hook,$params);        //监听一个钩子
    }

    模板中调用

    {:hook('app_init', array('name'=>'AV'))}

    最后总结:

    • 调用行为会执行 标签名方法(方法名就是钩子名称的驼峰命名(首字母小写)),如果没有标签名的钩子方法,自动调用 run() 方法,最后处理闭包里的业务。

    • 行为文件中的方法 return 返回的数据类型是数组类型

    • 模板中使用 :hook,需要在公共函数文件中定义hook 监听钩子

    相关文章:Thinkphp实战利用钩子使用行为扩展 (Hook)

       tp(php)插件(钩子)的简单实现机制

  • 相关阅读:
    用fnmatch函数进行字符通配
    activity和service之间的相互通信方法
    IGMP协议简介
    Android2.2快速入门
    Android开发之旅:HelloWorld项目的目录结构
    Android的五大基本组件
    Android Service 组件
    TCP交互数据流 成块数据流
    为什么要进行IP选路?
    embOS实时操作系统 任务通讯
  • 原文地址:https://www.cnblogs.com/xuey/p/13169189.html
Copyright © 2020-2023  润新知