深入浅出drupal架构

来源:互联网 发布:a记录vps绑定域名 编辑:程序博客网 时间:2024/05/20 08:45

    说drupal是一个cms倒不如说是一个功能比较完善的框架,不同的人会用drupal干不同的事情。
 
    一个不太熟悉编程的人可以用它来快速搭建一个网站(之所以不说cms网站,是因为现在drupal已经可以做的更多),再加上数以万计的功能模块,基本可以满足大多数网站的需求。但这仅仅是使用drupal,就像国内的代工企业,只会按照国外的设计图纸组装,却并不知道实现原理,也就很难有创新。
 
    对于一个开发人员,drupal只不过是一个设施完善的舞台,而你可以决定演员、背景、演什么、怎么演,甚至是一束光的亮度、一个话筒的位置。
 
    这就是drupal最神奇的地方。

    drupal为什么能做到这些呢?
 
    因为drupal在设计的时候就已经考虑好了一切,在每个使用者(或者说开发者)有可能加入自己特殊设计的地方都留下了接口。什么意思呢?就像家里装修一样,在每个需要用到电器的屋子里都会在墙上留下一个插座,比如客厅需要看电视,就在客厅墙上放一个插座用来看电视(当然你也可以用这个插口接cd机或者再接个插座),储物间不需要用电器于是就没有留插口。
 
    也许你会问,那干嘛不把所有的墙上都放上插座啊,万一有人就喜欢在储物间里用吹风机吹头发呢。
 
    在用drupal开发过程中,也确实是有这种可能性的,但这毕竟是少数,检查接口的内容也是有系统开销的,如果每一步都定义一个接口并检查有没有实现这个接口的函数,那对系统效率的影响是难以想象的。
 
    这种设计的另一个好处就是当你不需要某个功能,或者要改成其他功能,可以很容易的删除它而不需要修改核心(drupal框架)代码。就像拔下电视插头插上cd机插头一样,你就可以关上你讨厌的电视,来欣赏悠扬的音乐了。
 
    下面来看看drupal是如何实现这些功能的。

    drupal是单入口的架构,所有的请求(如url地址)都会首先经过index.php,这样可以将共用的代码都写在一起。每次看到一个个的php文件上来都是“include_once('./common.php');”我就觉得很别扭,万一common.php变了位置或者改了名字是不是所有的文件都要改一遍啊,就算这样做开发会快点、运行效率也高点,但是不能不考虑维护成本啊,这才是框架师存在的意义。扯得有点远了,下面继续。

    index.php首先会执行drupal_bootstrap()函数,它的作用就是初始化,将以后有可能用到的变量、session、缓存数据和数据库连接都准备好,共分8步,每一步初始化一个功能的数据。其中最后一步有个函数_drupal_bootstrap_full()是初始化所有功能模块的,就是把所有的模块文件include进来,就像你想要看电视,需要先把电视买到家里。

    index.php的第二步就是调用menu_execute_active_handler()函数,它的功能就是根据请求的参数决定调用哪个函数,比如我点击的注册按钮,就会调用drupal_get_form()函数来生成注册的表单(注册需要填写的信息)。而这个函数中有一个drupal_prepare_form(),这个函数是做生成表单前的准备工作,它其中有个函数叫drupal_alter(),这就是我们所要讲的精髓了。

    drupal_alter()就是我们前面所讲的墙上的插口,因为drupal框架的设计者认为在表单生成前,很有可能会有人想加入一些自己的设计,于是它就留下了这个接口。你写的模块只要实现了这个接口(只要函数名以_alter结尾就可以实现了这个函数),drupal就会在执行到drupal_alter()时调用你的这个函数。

    下面是具体调用你这个接口的代码。
 
    //其中$type是节点的种类与我们现在所讲的无关,不需要知道。
     foreach (module_implements($type .'_alter') as $module) {
         $function = $module .'_'. $type .'_alter';
         call_user_func_array($function, $args);
     }

    这是一个循环,module_implements($type .'_alter')会找出含有_alter结尾的函数(我们暂时忽略$type),并返回它们所在的模块(as $module),然后一个个的调用它们(call_user_func_array($function, $args))。

    drupal_alter()就是上面所说的插口,你写的功能模块或者其他已经写好的功能模块就是电视机、cd机。只要遵守插口的规定,就可以插到这个插座上。如果不需这些功能,直接删除模块,并不用通知drupal框架。就像不看电视了,直接拔下插头就可以了。

    接下来就是生成表单html代码,以及根据主题将html打印,整个流程就大致跑完一遍了。

    这里只是简单介绍drupal的架构,主要是说drupal的钩子机制,其实和spring的IoC(控制反转)是一个道理。更多的drupal精髓只能通过读枯燥代码自己总结。

原创粉丝点击