首页 理论教育PHPMVC开发实战:自定义行为扩展

PHPMVC开发实战:自定义行为扩展

【摘要】:ThinkPHP的一大特点就是扩展灵活,同样行为也是可以自定义扩展的。接下来将深入介绍自定义行为扩展的实现。上述代码是一个名为AutoCheckUserLogin的自定义行为类。最后还需要确保自定义行为类继承于Behavior基类。事实上,AutoCheckUserLogin配置项并不是必需的,也就是说在配置时,自定义行为就已经能够正常运行了,配置项只不过用于实现灵活的配置。此时,再次访问项目,只有Index控制器下的页面受AutoCheckUserLogin自定义行为影响,其他页面则不受影响。

通过前面的介绍,相信读者已经能够掌握内置行为扩展的使用。ThinkPHP的一大特点就是扩展灵活,同样行为也是可以自定义扩展的。利用自定义行为扩展,能够使编程更加灵活,因为扩展是一种拦截机制,一旦开启整个项目都受其约束,这个过程开发人员不需要在项目控制器或类库中编写任何代码,只需要在配置文件中简单地配置即可。接下来将深入介绍自定义行为扩展的实现。

1.创建自定义行为

自定义行为类的定义与普通类库及控制器有较大不同,自定义行为类库虽然也是PHP功能类,但自定义行为只有一个入口函数run,使用options成员属性映射项目配置项,如以下代码所示。

978-7-111-42852-7-Part02-669.jpg

978-7-111-42852-7-Part02-670.jpg

上述代码是一个名为AutoCheckUserLogin的自定义行为类。其中options成员属性是可选项,但却是重要的配置项,options成员属性值将被系统映射为项目配置文件中的配置项。例如上面的AutoCheckUserLogin数组项,在运行时系统会将该元素映射为配置文件中的AutoCheckUserLogin配置项,在项目中或者行为方法里直接使用C函数即可获得配置项值。

run方法是行为类中最关键的方法,也是普通类与行为类最明显的区别,run方法是行为类的入口,相当于普通类的构造函数,所以在创建行为类时只需要该方法设为Public即可。最后还需要确保自定义行为类继承于Behavior基类。

自定义行为类创建完成后,只需要将该文件保存到项目Lib/Behavior目录中,并以“行为名+Behavior+.class.php”的方式命名文件即可。这样一个名为AutoCheckUserLogin的自定义行为就可以直接使用了。

2.使用自定义行为

创建完自定义行为后怎么使用,这是初学者容易困惑的问题。事实上自定义行为不需要写任何调用代码,只需要配置即可。继续以AutoCheckUserLogin行为为例,要使用该行为只需要两步。首先在tags.php文件中指定行为的运行阶段(参照图11-8),如以下代码所示。

978-7-111-42852-7-Part02-671.jpg

因为在设计行为时指定了只有配置参数AutoCheckUserLogin为true时才执行用户检查,所以还需要在配置文件中开启AutoCheckUserLogin,如以下代码所示。(www.chuimin.cn)

978-7-111-42852-7-Part02-672.jpg

事实上,AutoCheckUserLogin配置项并不是必需的,也就是说在配置时,自定义行为就已经能够正常运行了,配置项只不过用于实现灵活的配置。通过前面的步骤,现在访问项目任意一个页面,都会执行用户登录检测。

行为的调用(即触发)并非只有配置tags.php文件一种方式,但无论从灵活性还是方便后期维护考虑,使用tags.php文件配置都具备优势,所以这里不再对其他调用方式进行介绍,感兴趣的读者可以参阅官方提供的开发手册。

通过上述操作,可以看到自定义行为的使用与内置行为的使用并无区别。同时行为机制的引入,对项目整体控制提供了高效、灵活的处理方式。

3.配置自定义行为标签

前面介绍过,标签就是行为的别名,一个标签可以对应多个行为。但这些标签都是系统内置的,用于表示程序(所有基于ThinkPHP构造的应用)不同的运行阶段,事实上开发人员也可以自定义标签,用于表示当前项目或控制器的不同运行阶段。假设需要在当前控制器载入时执行前面创建的AutoCheckUserLogin行为,代码如下所示。

978-7-111-42852-7-Part02-673.jpg

上述代码表示在Index控制器初始化时添加一个“index_init”行为标签。添加标签后,AutoCheckUserLogin行为触发标签不再是“app_init”而是“index_init”,如以下代码所示。

978-7-111-42852-7-Part02-674.jpg

此时,再次访问项目,只有Index控制器下的页面受AutoCheckUserLogin自定义行为影响,其他页面则不受影响。

ˆ 提示:如果需要让该标签约束当前项目,可以将标签定义在公共控制器中,项目下的控制器继续用该公共控制器即可。同样的原理,自定义标签也可以定义在控制器前操作或后操作方法中,实现单个动作页面的行为控制。