zoukankan      html  css  js  c++  java
  • thinkphp5 行为(钩子)扩展

    行为整理链接

    浅谈PHP中的钩子

    钩子相当于一个插件,在某些执行顺序上插入进去。

    行为可以在写app接口中对所有请求执行到控制器前 执行用户权限判断,sign验证等,这样就不用在每个接口中判断了

    注意事项
    1.触发行为的关键方法是Hook类中的listen方法,它通过遍历某个行为标签下的所有行为,依次实例化并调用run方法
    2.listen方法中,如果之前在配置文件中开启了DEBUG模式,则它会生成日志记录你的行为,这里面牵涉到3.很多的IO操作,所以你的项目完成时建议取消DEBUG模式以提升速度
    3.listen方法中,允许传递参数且只允许传递一个参数(传多个可以用数组呢),不过这个参数是引用传值,所以只能传入变量,传入常量会报错
    4.最后,LibraryThinkBehavior.class.php,这个抽象类中只有一个抽象方法run(),在你的自己行为扩展中建议继承它,尽管这不是必须的,但是这样更加规范
    listen()---->加载注册的标签(如targs.php里的)------->遍历注册标签的键取出值,并且依次实例化标签键的值存放的类--->执行run方法:
     

    例子:

    在应用或模块下建 behavior目录,目录内建行为类文件Test.php(以下以home模块为例)

    namespace apphomeehavior;//注意应用或模块的不同命名空间
    class Test {
        public function run(&$params){
            echo $params;
        }
    }

    行为定义完成后,就需要绑定到某个标签位置才能生效,否则是不会执行的

    home模块下建tags.php文件将行为绑定绑定(注册)到app_init和zzzzz标签上

    return [
        'app_init'=> [
            'app\home\behavior\Test', //注意行为的命名空间(下同)
        ],
        'zzzzz'=> [//自定义标签位
            'app\home\behavior\Test',
        ],
        //.................
    ];

    控制器方法内需要的地方侦听行为(比如在随便某个控制器的index方法中添加)

    $params='ok';
    hinkHook::listen('app_init',$params);//参数为变量(下同) hinkHook::listen('zzzzz',$params);//自定义

    访问这个index方法  输出  okok

    例子2:比如我们想在首页加载广告:

    1.在控制器中 Application->Home->Controller->IndexController.class.php

    namespace HomeController;
    use ThinkController;
    use ThinkHook;//引用Hook
    class IndexController extends Controller {
        public function index(){
            //手动注册行为 ad 是注册行为的名称 后面的是路径 接下来会说如何新建路径中的文件(也可以在targs.php中配置自动注册)
            Hook::add('ad','Behavior\adBehavior');
            //触发行为 (这种是在控制器中触发行为,还有在html页面中触发行为的 接下来就会看到) $parnam 为想要带的参数 可以随便定义  
            //hook::listen('ad',$parnam);//我们不要在这触发而是在html模板上触发的话请注释这句
    $this->display(); } }

    在应用或模块下建 behavior目录,目录内建行为类文件Test.php(以下以home模块为例)

    namespace apphomeehavior;//注意应用或模块的不同命名空间
    class Test {
        public function run(&$params){
             //$arg为带过来的参数 可以在其中写入自己的业务逻辑 行为必须执行run 
                echo '我是一条'.$params['name'].'广告,'.$params['value'].'代言';       
                //在此介绍下,run必须的 ,细心的会在Think核心找到Behavior.class.php里面有这样一句操蛋的话  abstract public function run(&$params); 你懂的
        }
    }

    公共函数文件封装下触发行为的方法:

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

    4、在模板中使用 Application->Home->View->Index->index.html 添加如下代码:

    <body>
        <h1>How to used?</h1>
        {:hooklisten('ad', array('name'=>'AV','value'=>'*老师'))} //这个呢就是在页面中触发行为的方式了
    </body>
  • 相关阅读:
    JVM性能调优的6大步骤,及关键调优参数详解
    JVM内存调优原则及几种JVM内存调优方法
    关于大型网站技术演进的思考(十六)--网站静态化处理—前后端分离—下(8)
    关于大型网站技术演进的思考(十五)--网站静态化处理—前后端分离—中(7)
    关于大型网站技术演进的思考(十四)--网站静态化处理—前后端分离—上(6)
    关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)
    关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
    关于大型网站技术演进的思考(十一)--网站静态化处理—动静分离策略(3)
    关于大型网站技术演进的思考(十)--网站静态化处理—动静整合方案(2)
    关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)
  • 原文地址:https://www.cnblogs.com/lichihua/p/10426521.html
Copyright © 2011-2022 走看看