#1 jake

SpeedPHP框架的扩展功能,可以分成两类:


  • 第三方类库及函数库,通过spClass或import载入即可使用。
  • 使用框架定义的扩展点,改变框架内部执行流程的扩展功能。


第一种类型

第一种类型的扩展程序可以直接在应用程序中使用,如UTF8转码类、文件上传类等。

在使用类库或函数之前,必须载入第三方类库或函数库的定义文件,可以在用到类库/函数库之前使用import或spClass进行载入,也可以在全局定义位置载入这些定义文件。

在全局位置载入的类库/函数库,通常是整个应用程序经常用到的功能,如将需要注册到模板中使用的函数等。在使用之前载入的类库/函数库,均是较专门的功能,如拼音类、验证码类等。
一般而言,使用import来载入函数库文件,而大部分类库文件,在类名和文件名相同的情况下,都可以通过spClass载入,spClass的好处是载入定义文件的同时进行实例化操作。
类库/函数库应放置在“应用程序扩展目录”,框架默认的“应用程序扩展目录”是应用程序目录下的“include”目录(如无可新建),开发者可以通过配置“include_path”增加或修改“应用程序扩展目录”。

在控制器、模型类中,已载入的类库/函数库即可直接使用。而模板中的函数,通过需要使用spAddViewFunction来进行注册到模板的操作才可使用。


第二种类型
第二种类型是使用了框架定义的扩展点,对框架内部执行流程进行改变的扩展类/函数。
其实第二种类型的类/函数和第一种基本相同,不同之处在于对框架扩展点的使用,而且从功能上而言,第二种类/函数的功能更接近于框架本身的核心函数和类库。

第二种类型的类/函数,通常是在全局位置载入定义文件,然后让框架自行执行其功能;当然,如果是“类名与文件名相同”的类,可以无需载入,当扩展点需要使用该类的时候,将会调用spClass直接载入类定义文件并实例化——以下说明的spUrlRewrite类就是这样载入的。


在SpeedPHP框架中,有着许多的扩展点,这些扩展点都是在框架执行过程中比较关键的位置,如路由执行前等。而开发者可以通过对这些扩展点的配置,来达到改变框架执行的过程。以下通过框架自带的spUrlRewrite(伪静态)扩展类来进行说明(代码请参见框架Extensions目录中的spUrlRewrite.php文件):


首先spUrlRewrite需要使用到框架的两个扩展点——路由前扩展点和spUrl地址生成的扩展点。

'launch' => array( 
                 'router_prefilter' => array(
                        array('spUrlRewrite', 'setReWrite'),
                ),
          'function_url' => array(
                        array("spUrlRewrite", "getReWrite"),
            ),
),

应用程序配置中的“launch”节点,就是配置扩展点执行的功能函数。上面的代码的功能是:


  • 扩展点“router_prefilter”将执行spUrlRewrite类的setReWrite成员函数。
  • 扩展点“function_url”将执行spUrlRewrite类的getReWrite成员函数。

路由前扩展点“router_prefilter”——在浏览器提交访问请求之后,服务器将根据配置的REWRITE机制,将请求转向执行入口文件(index.php),然后在框架系统需要执行路由操作之前,spUrlRewrite接管了路由设置,并分析访问的URL地址,解析出GET提交参数以及执行的控制器/动作,改变了框架当前将执行的控制器/动作,让框架系统转向执行URL请求的控制器/动作。这里,“路由前扩展点”起到了关键的作用。

核心函数spUrl中,也存在扩展点“function_url”。spUrlRewrite通过配置,接管了spUrl的返回值——也就是改变了框架本身的URL生成机制。spUrlRewrite直接将当前spUrl函数的参数装配成伪静态的URL地址,然后返回到spUrl。这样,spUrl将生成伪静态URL地址。

使用了以上两个扩展点,spUrlRewrite在没有修改框架本身源代码的前提下,对框架接收URL和生成URL进行了修改,从而达到解析和生成伪静态地址的功能。

在配置中,有些扩展点是可以同时存在多个功能配置,如spUrlRewrite使用的“router_prefilter”就可以继续加入spAcl的扩展功能(权限控制也是在路由前执行的),有些扩展点是只能有一个配置功能,如“function_url”仅能有一个功能配置。
关于各个扩展点的特性和功能,请参考扩展点的相关文件。

同时,我们可以看到,spUrlRewrite是通过配置“ext”来进行URL地址定义的。由于使用扩展点的类库/函数库(比如spUrlRewrite)很多时候是无法直接赋值——因为它们都是通过框架内部的扩展点来执行的,所以在SpeedPHP框架中增加了spExt核心函数。spExt函数可以在这些类库/函数库内部使用,其作用是调用应用程序配置节点“ext”中的相应配置,从而使得类库/函数库可以通过应用程序配置来进行赋值。下面同样用spUrlRewrite来进行说明:

spUrlRewrite的应用程序配置,大致如下:

'ext' => array(
                'spUrlRewrite' => array(
                'suffix' => '.html',
                'sep' => '-',
                'map' => array(),
                'args' => array(),
        ),
),
以上就是spUrlRewrite类需要的配置参数,然后在spUrlRewrite.php文件中,约69行的构造函数中:
public function __construct()
{
        $params = spExt('spUrlRewrite');
        if(is_array($params))$this->params = array_merge($this->params, $params);
}       
spUrlRewrite类的构造函数,通过spExt('spUrlRewrite')来获取到了上面的设置,并且赋值给spUrlRewrite的params成员变量。也就是说,spExt函数和配置“ext”节点是一一对应的。
当然,配置中“ext”不仅可以有“spUrlRewrite”的配置节点,还可以继续增加更多的节点。

2012-08-04 23:51:26