zoukankan      html  css  js  c++  java
  • 行为扩展以及插件机制

     在thinkPHP中的行为扩展和插件机制。

    首先行为扩展这个概念是TP框架的核心组成之一,关于行为的解释我就粗略的概括一下吧:

    TP在从接受到HTTP请求到最终将试图输出,期间经历的很多步骤,这些步骤大家可以在http://document.thinkphp.cn/manual_3_2.html#system_process这里面看到。

    那么行为扩展实际上就是在这些流程里面买下了一个钩子,你可以往钩子里添加你自己的业务逻辑

    当程序执行到某些钩子位置时将自动触发你的业务逻辑,http://document.thinkphp.cn/manual_3_2.html#behavior_extend。

    本文的主要目的是教大家如何使用行为扩展和插件,这里为什么要提到“插件”这个词呢?

    因为在3.2里,有了一个插件的概念,和行为公用的HOOK类,所以放在一起说,原理上并无

    并无太大区别。

    -、行为扩展 

    1.TP 内置行为钩子

    我们知道TP中预留一些行为钩子,比如action_begin,这个钩子实在动作开始执行时触发,

    预置的钩子大家购过配置文件注册行为类,大家在Application/Common/Conf目录下创建一个

    tags.php。这个和3.1是一样的,返回一个数组。

    数组个会是“钩子名”=>“array(“行为类”,“行为类2”......................)”

    这里我给一个例子:

    Application/Common/Conf/tag.php:

    <?php

    return array(

    "action_begin"=>array("Behaviors\test")

    );

    ?>

    可以看到,我往action_begin这个钩子里面注册一个行为,这个行为就是Beha\test这里

    的写法是命名空间写法,其对应的类文件路径是:

    Application/Behaviors/testBehavior.class.php:

    <?php

    namespace Behaviors;

    class testBehavior{

    function run ($arg){

      echo "这里是一行为扩展"。$arg;

    }

    }

    ?>

    千万要注意第一行的命名空间,对于命名空间不理解的请自行查阅php手册。

    另外对于TP的自动加载机制,参考手册:

    http://document.thinkphp.cn/manual_3_2.html#autoload

    行为的执行入口是run()方法,触发钩子时会自动执行行为类里的run()方法。

    2.动态添加钩子和注册行为

    通过上面的而梨子大家才是了解了行为大概是个什么东西,但是对于其执行流程

    可能还不清楚,这里我来介绍下动态添加钩子和注册行为,是大家对行为执行机制

    有一个比较清晰的理解。

    首先,行为钩子添加和注册行为类,以及处罚行为,都是通过Hook类来实现的。

    Hook类在TP核心包里的ThinkPHP目录下,Hook.class.php。

    >>添加钩子以及注册行为:ThinkHooK::(‘钩子名’,‘行为’)

    >>埋设/监听/触发钩子:ThinkHook::listen(‘钩子名’,‘传递给run的参数,必须是个变量’ );

    假如我们需要在访问index.php/Public/login.html的时候触发login钩子里的行为,

    那么首先我们需要在login方法中监听钩子,也就是把钩子埋在login方法里,当访问login方法就是

    自动触发,有点像猎人的陷阱。

    function login(){

    ThinkHook::listen('login');

    }

    好了,我们在login方法里监听了login钩子,那么接下来我们往这个钩子里添加一些行为,

    这样访问login的时候会自动触发这些行为,执行行为类的run方法。

    行为在哪里注册了?

    1.你可以通过tags.php注册,上面提到过了,只不过把action_begin换成login.

    2.动态添加,假如这个钩子只在Public控制器中使用,那么你可以子啊PUblicController的

    _initialize()初始化方法肿么的动态添加钩子。

    function _initialeze(){

    ThinkHook::add('login','Behaviors\test');

    }

    这里就往login这个钩子里添加一个test行为,比较懒直接从上面复制下来。

    可以同时添加多个行为类

    ThinkHook::add('login',array('Behaviors\test','Behaviors\test1'....));

    就是第二个参数变成一个数组,数组里面每个元素对于一个行为类。

    3.带参数的行为

    上面我们知道了行为是通过run()方法执行的,那么我们想传递一些参数进去怎么办呢?

    答案是ThinkHook::listen();的第二个参数。

    注意listen方法定义如下:

    static public function listen($tag,&$param-NULL)

    可以看到第二个参数是一个引用传递的参数,也就是说第二个参数必须是一个变量,不能是值,

    下面的使用方法是错误的:
    ThinkHook::listen('login',"hello"); // x
    这样才是正确的
    $hello = "hello";
    ThinkHook::listen('login',$hello);//√

    这样我们在行为类里面run方法可以指定一个参数来接收$hello
    function run($arg){
    echo $arg;//输出 hello
    }
    当然你也可以
    function run(&$arg){
    echo $arg;//输出hello
    $arg = "bye";
    }
    这样参数设定为引用类型,你可以在run里面改变原始变量的值。

    二、插件

    看了上面的行为,我们可以总结出一个模式:
    定义不同的行为,执行同一个方法run ,而插件呢?

    他是可以定义在run的并且相当于在一个行为类里面可以有多个入口,这些入口在不同的条件下触发。

    假设我们在tags.php里面添加了这样一个钩子

    'showflash’=>array('test');

    注意与行为的区别,注册行为需要包含命名空间也是反斜杠\,当没有反斜杠,只有一个单词的时候将认为是一个插件。

    插件定义在Application/Addons/插件名/插件名Addon.class.php

    插件类的定义

    <?php
    namespace Addons est;
    class testAddon{
    function showflash(){
    echo "这是插件执行入口";
    }
    }
    ?>

    可以看出来一个明显的区别,就是run入口变成了showfalsh,和钩子名相同。

    假如我们再来一个钩子:

    ''=>

  • 相关阅读:
    NodeJS学习笔记 进阶 (11)Nodejs 进阶:调试日志打印:debug模块
    NodeJS学习笔记 进阶 (10)Nodejs 进阶:log4js入门实例(ok))
    NodeJS学习笔记 进阶 (9)express+cookie-parser:签名机制深入剖析(ok)
    NodeJS学习笔记 进阶 (8)express+morgan实现日志记录(ok)
    NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)
    NodeJS学习笔记 进阶 (6)本地调试远程服务器上的Node代码(ok)
    NodeJS学习笔记 进阶 (5)将图片转成datauri嵌入到html(ok)
    51nod 1287 线段树
    51nod 1043 数位dp
    51nod 1042 数位dp
  • 原文地址:https://www.cnblogs.com/yeyublog/p/6081147.html
Copyright © 2011-2022 走看看