thinkphp 行为扩展

网站程序在运行的过程每个过程都可以看做是一种行为,例如:运行应用,加载类,执行方法,加载模板,解析模板等,也就是说,我们在程序执行过程中每个 步骤都可以 定义一些点,我们可以在运行 程序的时候 检查 配置文件 中有没有定义 这些点 对于操作哪些 方法,如果有,则在这个点上加载执行 特定的方法。执行完,上面进行的方法没有中断退出程序操作,则程序继续进行 原来业务操作。

这种行为的扩展,可以方便,产品完成以后,需要在原功能上添加功能,常见的例如:在应用执行前 先检测是否登录;在用户执行应用前先检测 用户设备信息;用户登录完成,给用户加积分等。

下面是thinkphp 的行为扩展的使用

官方文档手册 行为扩展

第一步:首先是到你的模板下Common\Conf\tags.php 看看是否有这个 tags.php 文件,如果没有那么就自己建一个

第二步:配置你的 插入点 所要进行 方法,配置例如:

<?php
return array(   'app_end'=>array('Home\\Behaviors\\testBehavior','Home\\Behaviors\\test1Behavior')
);

  上面app_end是插入点名称,对应的值定义了两个 行为,也就是说,当程序执行到 app_end这个点的时候 会加载 这个配置中的这两个类来执行,每个点都可以有多个 行为类。

上面的这两行为类 是放在放在 Home模块下的Behaviors文件下的两个类,这些类可以放到如何地方,只要配置中配置好就可以了

下面,我们就在Home\Behaviors\下去建这两个行为

上面注册了两个行为,分别是Home模块下的test和test1行为,类文件位于Home模块目录下的Behaviors目录,可以自定义目录。 行为必须是一个包含命名空间路径的类,如上的 Home\Behaviors\test 对应的类是 Home/Behaviors/testBehavior.class.php。

第三步:到自己定义的目录下建这个行为类

文件testBehavior.class.php代码如下

<?php
namespace Home\Behaviors;
use Think\Behavior;
class testBehavior extends Behavior{
    //行为执行入口
    public function run(&$param){
        echo '这是我的插件';
    }
}

这样只要我们程序运行到app_end这个点就会执行我的这个类的 run()方法。

运行结果如下:

我们在类中继承了Behavior这个内置类的,必须要实现 他的run(),所以这里用&来引用传值进行执行,很明显这样不是我想要的,我们就像要自由一点。

下面进行改造,我们不继承了他默认的行为类了,按照官方规定我们的行为类,只要有run()这个方法,程序就会自动执行这个run(),那么就我们把我们行为改为如下的:

namespace Home\Behaviors;
use Think\Controller;
class testBehavior extends Controller{
    //行为执行入口
    public function run($param){
        echo '这是我的插件';
    }
}

现在的参数不用&来引入传值都不会报错了,插件仍然可以正常运行。

 

动态添加 行为,并在模板中调用

如果,我们不想用框架 预定义的插入点, 我想在我们 方法中 定义我们的 行为点,并模板中调用,那么,我们在Common\Conf\tags.php把 我们这个行为类去除,否则多次执行这个行为了。

现在我们想在news类中的lists 方法中 动态添加 一个行为 检测点为 ad, 要执行的行为 是Home/Behaviors/testBehavior.class.php 代码如下:

<?php
namespace Home\Controller;
use Think\Controller;

class NewsController extends Controller{

    public function lists()
    {
        \Think\Hook::add('ad','Home\\Behaviors\\testBehavior');//这里动态添加一个 ad 的行为
        $this->theme('default')->display('./newslist');
    }

}

我要在模板中 要调用这个 ad 的行为 那么我就可以在newslist这个模板中 用以下发方式调用

{:tag('ad')}

这样就可以在我们的特定地方调用这个插件,效果如下

posted @ 2016-06-14 13:45  小蜂鸟  阅读(296)  评论(0编辑  收藏  举报