模块及命名空间


在CrossPHP项目中, 默认的模块结构如下

├─app
│  └─web
│      ├─controllers
│      └─views
├─modules
│  └─admin

app按文件夹划分, 每个app都包含独MVC模式中的CV层, 以及V层模板和布局文件. Modules包含各app公用的模块, 传统框架的Model只是Module的一个成员

控制器

控制器位于对应appcontrollers文件夹下, 以web为例, 控制器的命名空间为:

namespace app\web\controllers;

规则如下:

app\文件夹名称\controllers

依据此规则, 假设名为admin的app的控制器命名空间就为:

namespace app\admin\controllers;

视图控制器

与传统的MVC框架比, 多了视图控制器的概念, 视图控制器命名和控制器命名保持一致, 并在结尾增加View. 假设名称是Main的控制器, 对应的视图控制器的名称就为MainView, MainView.php文件放在app/web/views文件夹中, MainView类的命名空间为:

namespace app\web\views;

视图控制器用于处理模板数据, 在视图控制器中定义的方法, 可以在模板中直接调用. 这很轻易的实现了对模版的扩展. 当要从HTML视图切换到JSON\XML或未来的某种格式时, 只需要先在视图控制器中添加对应处理的方法, 再把app配置文件中的视图格式配置指定为方法名就可以了(sys->display).

Modules

Module不是单一的Model, 在现代WEB开发中, 数据来源可能需要多个Model配合, 比如先从缓存Model中检查缓存数据是否存在, 如果存在就直接返回, 不存在就从数据库Model中去获取数据, 保存到缓存, 以备下次使用. 传统的Model只是Module中的一个成员.

Module服务于所有的app, 以保持不同app中数据来源的一致性. Module根据功能来划分, 不同的功能分别放到不同的文件夹, 假设有admin, user, article三个功能模块, 他们在Modules文件夹下的路径分别是:

modules/admin
modules/user
modules/articles

他们的类命名空间分别是:

namespace modules\admin;
namespace modules\user;
namespace modules\articles;

自定义模块

除了以上默认的模块以外, 你也可以在自己的项目中自定义模块, 自定义模块的命名规则如下:

自定义模块名称\子模块名称

自定义模块名称即文件夹名称, 假设现在要定义验证模块validate, 首先在项目根目录下新建文件夹validate, 创建好的项目结构如下:

├─app
│  └─web
│      ├─controllers
│      └─views
├─modules
└─validate

在validate下新建一个类文件UserValidate.php, 输入以下内容用于验证用户相关信息:

namespace validate;

class UserValidate
{
    static function name($user_name)
    {
        echo $user_name;
    }
}

使用自定义模块

我们可以在项目的任何位置使用这个用户验证类, 只需在要使用的类里注明命名空间就可以了, 在控制器中的使用方法如下:

namespace app\web\controllers;

use validate\UserValidate;

class Main extends Web
{
    function index()
    {
        UserValidate::name("abc");
    }
}

你可以根据项目需求自定义各种模块, 更优雅的完成工作