Skip to content

Tutorial.Module Design I.zh_cn

linzongshu edited this page Jul 4, 2013 · 2 revisions

English

1 引言

Zend Framework 2.0开始支持模块化编程,也就是将具有一定功能的代码封装成一个独立的模块,这样不同的功能块之间就实现了解耦,方便了代码维护,也提高了开发效率。Pi Engine也沿成了Zend的模块化编程思想,同时Pi Engine对模块内部的目录结构进行了重组,使其更方便用于平台开发。Pi Engine对模块化编程的思想也做了扩展,形成了Pi Engine自己的模块特点:模块组装及多实例。

1.1 模块特点

  • 模块组装

模块组装也就是整个互联网产品根据功能的不同进行模块化。以新闻门户网站为例,根据网站的架构可将其分解为用户管理、文章管理和用户评论管理等。这些部分都有独立完整的功能,并且这些功能块也可以用在其他互联网产品上。因此我们就可以将这些部分封装成一个个独立的模块,换句话说,这个新闻门户网站就是由用户模块、文章模块和评论模块等组成的。这种模块可组装的特点在软件开发中很常见,这种特点能很大程度地缩短开发周期。

  • 多实例

Pi Engine的模块是支持安装的,安装后的模块数据都保存在数据库里。模块的多实例也就是指模块可以重复安装,安装后的模块共用一套处理代码,但其分别在数据库里维护一套自己的数据,这些数据根据用户安装模块时指定的模块名加以区别。

1.2 一些基本的概念

在进行模块编程时,我们经常会涉及到几个概念,如控制器(controller)、动作(action)、区域(section)等,在这里我们先作简单介绍。

  • 控制器(controller)

控制器就是MVC概念里的C,在代码实现时就是一个类,这个类用于响应浏览器请求并返回请求结果。

  • 动作(action)

动作就是控制器类里一个具体的方法,这个方法对应一个具体的请求。

  • 区域(section)

也就是开发平台里的位置,Pi Engine主要将其分为四个部分:前台(front)、后台(admin)、Feed和区块(block)。

前台(front)就是面向外部的用户,也就是产品最终呈现给互联网用户的部分,这部分不需要权限都能访问。

后台(admin)就是面向网站管理员的部分,在这里管理员可以对模块进行配置、对注册的用户进行管理或者进行访问权限的控制等,这部分需要有一定的权限才能访问。

Feed部分主要是完成整个网站的RSS订阅。

区块(block)是和模块的主体内容一起组成一个页面,它在模块里也有独立的代码。这部分的内容将在区块一章里详细介绍。

2 模块的目录结构

模块包都是放在urs/module目录下,如现在Pi Engine初始的模块有system, page, demo和widget四个,在这里以demo模块为例,其基本的目录结构为:

fig2-1

图2-1 模块目录结构

  • asset

asset文件夹主要放置模块的静态文件,如logo图片,js和css文件,这个静态目录在安装的时候将会被发送到www/asset目录下,并以module-{module name}的形式命名,这样外部有就权限访问了。asset里的目录及文件夹名都可以自己定义,在程序里有API来生成相应的访问路径。

  • config

config文件夹主要存放模块的配置文件,这些配置文件里的内容在模块安装的时候将被写入数据库,这个目录下至少需要有一个module.php文件,用于定义模块的基本信息以及指定要安装的其他配置文件。

  • sql

sql文件夹存放模块安装时需要添加的数据表的sql文件。

  • src

src文件夹存放模块的核心代码,这个文件夹里与系统相关的代码所在的文件夹名及其目录结构都是规定好的,不能更改,并且文件夹名都必须用大写,如: Controller: 定义前后台(Front/Admin)的控制器类;

Form: 定义表单及表单验证的类;

Model: 定义数据表操作的类;

Registry: 定义缓存操作的类。

  • template

template文件夹存放前后台的模板文件,这里定义的文件都是以phtml作为扩展名,文件里可以HTML标签和PHP语言混写,用于生成HTML页面发送给浏览器。一般来说,每一个模板都对应一个controller类里的action。

3 模块开发流程

这一节里对模块开发流程设计作下简单介绍,做开发设计主要是为了将模块开发过程中会涉及到的需求、配置、controller/action、API以及数据库等作文档输出并评审,经过评审后的模块设计更规范,同时模块开发者根据这个文档能更快速进行开发。同时也方便模块的维护。

模块开发主要包括四个阶段:需求整理、模块设计、模块开发和模块测试。具体每个阶段需要涉及的内容(文本输出及文本模板)可以参考:

https://github.com/pi-engine/pi/wiki/Dev.Module-Workflow

在这四个阶段里,模块开发者主要涉及到模块设计和模块开发。

下面的章节里,我们将以member模块为例,介绍如何进行模块开发,member模块的模块设计参考:

https://github.com/pi-engine/pi/wiki/Tutorial.Training-Checklist

4 模块的基本配置

4.1 模块的配置文件

模块的配置信息都保存在config文件夹下,一个能够安装的模块至少需要一个module.php配置文件。配置文件都以return array()的形式为内容,配置信息都写在数组里。

在usr/module目录下创建一个member文件夹(文件名小写),然后在member下创建config文件夹,并在config文件夹下里添加文件module.php:

member
|- config
    |- module.php

向module.php里添加如下代码:

文件:usr/module/member/config/module.php

Code 2.4.1

<?php
return array(
    'meta'  => array(
        'title'         => __('Member Demo'),
        'description'   => __('A module realize user register for training'),
        'version'      => '1.0.0-beta.1',
        'license'      => 'New BSD',
        'logo'         => 'image/logo.png',
        'clonable'      => false,
    ),
    'author'    => array(
        'name'      => 'Zongshu Lin',
        'email'      => 'zongshu@eefocus.com',
        'website'    => 'http://www.xoopsengine.org',
        'credits'     => 'Zend Framework Team; Pi Engine Team; EEFOCUS Team.'
    ),
    'maintenance'   => array(
        'resource' => array(
            'database'  => array(
                'sqlfile'   => 'sql/mysql.sql',
                'schema'    => array(
                    'user'          => 'table',
                ),
            ),
            //'navigation'    => 'navigation.php',
        ),
    ),
);

在上面的代码里,整个返回的数组至少由'meta', 'author', 'maintenance'这三个字段组成,并且字段名不能更改。

  • meta meta字段主要包含模块的基本信息,并用'title', 'description', 'version', 'license', 'logo', 'readme'和'demo'等字段标识:

title - 模块名称,必选,在模块列表里显示,这里的__()是翻译函数,在本地化一章会介绍;

description - 模块描述,可选,也显示在模块列表里;

version - 版本号,必选,版本号的格式有特定要求,在后面会提及到,版本号将会记录在数据库里,在模块更新时会用到;

license - 许可证,必选,默认为New BSD;

logo - 模块logo,可选,值为logo图片在asset目录下的相对路径;

clonable - 模块是否可克隆,可选,默认值为false,这个值标识了模块是否可多实例。

**注意:**这里的模块名称需要与模块唯一名称(一般用name标识)区别,title只用于显示,告诉用户这是什么模块,唯一名称是用于区别不同模块,或相同模块的不同实例,程序也是通过name来区分模块,唯一名称在安装时定义。

  • author

author定义了模块开发者的基本信息,用name, email, website和credits字段标识,除name外,其他字段均为可选。

  • maintenance

maintenance字段定义了模块需要加载的资源和数据表的基本信息。这些信息都放在resource字段里。

database - 定义数据表的基本信息,sqlfile字段定义了创建数据表的sql文件的相对路径,schema数组定义了模块在卸载时需要删除的数据表,其字段名为表名,值为table。

navigation - 定义了安装时需要加载navigation.php这个文件,这个文件需要在config文件夹里创建,目前我们暂时用不到这个配置文件,因此在这里将其注释掉。 至此,一个最基本的模块配置已经完成。如果不需要使用数据库,这个模块就可以安装了。

4.2 模块的安装

因为这里我们只是创建了一个基本的可安装的模块配置,因此不需要为其创建数据表(没有创建sql文件),为保证正确安装,Code 2.4.1里的database字段就可以先删除掉。

...
'resource' => array(
),
...

这个教程里,我们将本地Web根目录下的Pi工程包命名为course,因此访问localhost/course/www进入Pi首页,用安装第四步里设置的用户名和密码登陆,菜单栏里多了Admin Area一项。

fig2-2

图2-2 登陆成功后的前台页面

点击Admin Area进入系统后台,依次点击Operation -> Modules -> Availables就可以看到一个Member demo模块。

fig2-3

图2-3 后台可获取的模块列表

点击Install按钮,在弹出的对话框里分别填入模块的唯一名称和名称(如果是首次安装,唯一名称可用默认值),并点击确定完成模块安装。如果模块是不可克隆的,它将不再出现在Availables里。模块安装成功后,在Installed里可以看到。

[Module Design II](Tutorial.Module Design II.zh_cn)

Clone this wiki locally