【Phalcon】路由拆分

写在前

去年使用过PHP的Flight框架编写api,Flight框架非常简单,只需要花一点点时间看官方文档即可上手写代码,原生支持Restful风格。刚开始没觉得什么,只要有需求则加一个路由,由于项目不大,总共也不超过10个。

最近在使用Phalcon,项目规模中等,在路由(routes.php)那里遇到了本文所关注的痛点,几十个路由放在一个文件中,而且还会继续往里加,当达到一定的数量级,如果有一天,我想改其中某一个路由(名称忘了或者记不清),则需要滚动鼠标刷半天才找到。代码混乱,所有的controller/action都放在这里管理。

如下

/**
 * 首页
 */
$router->add(
    "/",
    [
        "controller" => "index",
        "action"     => "index",
    ]
);

/**
 * 用户信息
 */
$router->add(
    "/user/info",
    [
        "controller" => "user",
        "action"     => "info",
    ]
);

/**
 * 添加商品到购物车
 */
$router->add(
    "/shopcart/add",
    [
        "controller" => "shopcart",
        "action"     => "add",
    ]
);

...

正文

既然有痛点,那就想解决办法

Phalcon通常的项目结构大概是这样的

app/                                   #应用程序
     cache/                            #缓存文件
          data/                             #缓存数据
          metaData/                         #缓存元数据
          models/                           #缓存模型
          views/                            #缓存视图
          volt/                             #缓存volt模版文件
     config/                           #配置文件
          config.example.php                #配置文件(加载环境配置,返回所有配置)
          development.example.php           #开发环境配置(定义debug模式等)
          env.php                           #配置文件(定义基路径,定义全局变量,设置环境异常模式)      
          nginx.example.conf                #nginx配置
          routes.php                        #返回路由配置
          timezones.php                     #返回时区配置
     controllers/                           #控制器
     library/                               #类库文件(工具类,启动文件)
          Badges/                           #
          Github/                           #
          Http/                             #
          Mail/                             #
          Markdown/                         #
          Mvc/                              #
          Notifications/                    #
          Paginator/                        #
          Queue/                            #
          Search/                           #
          Utils/                            #
          Bootstrap.php                     #启动文件
     logs/                                  #日志文件
     models/                                #模型类
     views/                                 #视图(volt模版)
docs/                                  #项目说明文档 
opsfiles/                              #运维工具配置文件
public/                                #公共目录
     css/                              #样式文件
     fonts/                            #字体文件
     icon/                             #图标文件
     js/                               #javascript脚本
     .htaccess                         #路由重写规则(指向该目录下的index.php)
     505.html                          #服务器异常展示文件
     index.php                         #引导文件(框架先从这里开始执行)
schemas/                               #sql文件
scripts/                               #服务器脚本
test/                                  #单元测试
.env.example                           #用户专属环境配置
.htaccess                              #路由重写规则(指向public目录下的index.php)
.htrouter.php                          #与.htaccess文件功能一样,包含public目录下的index.php
composer.json                          #依赖管理文件

加载流程:


1./public/index.php
use app\library\Bootstrap;
使用命名空间的方式,划分程序块

include_once realpath(dirname(dirname(__FILE__))) . '/app/config/env.php';
include_once BASE_DIR . 'app/library/Bootstrap.php';
第一行,包含配置文件,配置文件中有BASE_DIR的定义,APPLICATION_ENV的定义
第二行,包含引导文件

$bootstrap = new Bootstrap();

if (APPLICATION_ENV == ENV_TESTING) {
    return $bootstrap->run();
} else {
    echo $bootstrap->run();
}
声明Bootstrap对象,开始执行

找到Bootstrap.php,初始化路由的代码如下

/**
     * Initialize the Router.
     */
    protected function initRouter()
    {
        ...
        $router = include BASE_DIR . 'app/routes/routes.php';
        ...
    }

可以发现,路由是这样包含进框架的,去到我们的routes.php,把原来的路由拆分成各自模块的文件,然后包含进routes.php,这样做的好处是,模块化管理,便于查找和修改。

routes.php




use Phalcon\Mvc\Router;

$router = new Router(false);
$router->removeExtraSlashes(true);


/**
 * loader the urls
 */
$urls = [
    'index',
    'shopcart',
    'user',
];
foreach ($urls as $url){
    include BASE_DIR.'app/routes/'.$url.'.php';
}

return $router;

user.php



/**
 * 用户信息
 */
$router->add(
    "/user/info",
    [
        "controller" => "user",
        "action"     => "info",
    ]
);

你可能感兴趣的:(【PHP】,【Phalcon】)