博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
phalcon:使用路由和命名空间实现分组or模块化
阅读量:6270 次
发布时间:2019-06-22

本文共 1979 字,大约阅读时间需要 6 分钟。

  hot3.png

首先是命名空间,利用命名空间我们很方便的组织目录结构,而又不用担心自动加载效率和类冲突,假设我们的项目需要如下的模块化结构:

/

/app
----/home   默认模块
--------/controller
--------/model

----/admin   后台管理模块

--------/controller
--------/model

/public

----index.php  //入口文件

我们在入口文件  /public/index.php中先注册autoloader:

//Register an autoloader    $loader = new \Phalcon\Loader();    $loader->registerNamespaces(        array(           'admin'    => "../app/admin",           'home'=>"../app/home"        )    )->register();

在上面的代码中,我们通过$loader组件的registerNamespaces方法来注册了两个命名空间的根目录,分别对应home模块和admin模块。

接下来我们在admin/controller目录下创建一个IndexController.php控制器:

我们的想法是:当我们访问 /admin或者/admin/index或者admin/index/index的时候,输出"admin/index"这个字符串。
phalcon默认的路由规则是 /:controller/:action/:params 显然无法达到我们的要求。
我们需要配置一下路由,同样在/public/index.php中添加:
//Create a DI    $di = new Phalcon\DI\FactoryDefault();        $di->set('router',function(){        // Create the router        $router = new \Phalcon\Mvc\Router();        //Define a route        $router->add("/admin/?([a-zA-Z0-9_-]*)/?([a-zA-Z0-9_]*)(/.*)*",array("namespace"=>"admin\controller","controller"=>1,"action"=>2,"params"=>3));        $router->setDefaults(array(            "namespace" => "home\controller",            "controller" => "index",            "action" => "index"        ));        return $router;    });

这一段有点长,其实步骤很清晰:

1.创建一个DI容器实例

2.像容器中添加router组件,这里必须是router,因为phalcon默认会有一个router组件,而我们要覆盖它。
3.在router的回调函数中,我们创建了一个 Router组件的实例$router
4.通过$router->add()添加一条路由规则:/admin/?([a-zA-Z0-9_-]*)/?([a-zA-Z0-9_]*)(/.*)*
5.通过$router->setDefaults设置当没有匹配到的路由时,默认的设定。
这里着重看4、5两步,第4步我们直接用正则表达式来做路由规则,不要用 /admin/:controller/:action,原因是这样就无法匹配到 /admin 和 /admin/index 这两种短路径,而第5步中设置了默认的命名空间是home\controller ,这样当你直接输入域名以及url不以/admin开头的时候就会自动定位到 home/controller目录下。

通过上面的设置,我们测试通过:

/admin

/admin/index
/admin/index/index 
都成功定位到admin/controller/IndexController.php

/

/index
/index/index
则成功定位到 /home/controller/IndexController.php

关于访问控制就解决了,关于后面的model以及views笔者后续学习中会继续分享。

转载于:https://my.oschina.net/cxz001/blog/211950

你可能感兴趣的文章
Day4---D3:法律问题,合同和电子举证
查看>>
[译]搭建账户系统
查看>>
三种类型的DNS攻击以及应对方法
查看>>
Docker Swarm vs Kubernetes
查看>>
电商网站的支付接入该怎么做呢?
查看>>
六顶帽子思考法的好处
查看>>
关于Expression Tree和IL Emit的所谓的"性能差别"
查看>>
svn导出项目后报错汇总
查看>>
SAP数字化转型成不成功用事实说话:S/4HANA已获得3200家客户
查看>>
《社交网站界面设计(原书第2版)》——3.15 你是否在犯4种常见的用户onboarding错误...
查看>>
Salesforce即将推出Einstein人工智能CRM平台
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.4 未来展望
查看>>
美最大征信机构Equifax数据泄露 1.43亿美国公民个人信息被“曝光”
查看>>
如何在Linux命令行下浏览天气预报
查看>>
中国人工智能学会通讯——深度学习的迁移模型 一、迁移学习的三大优点
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
《中国人工智能学会通讯》——12.16 时空众包工作流程
查看>>
英国脱欧:3/4的技术初创公司将面临严峻时期
查看>>
JavaScript API 设计原则
查看>>
WiFi信号可进行隔墙观测 透过衣服观察人体轮廓
查看>>