首先是命名空间,利用命名空间我们很方便的组织目录结构,而又不用担心自动加载效率和类冲突,假设我们的项目需要如下的模块化结构:
/
/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();
接下来我们在admin/controller目录下创建一个IndexController.php控制器:
<?php namespace admin\controller; class IndexController extends \Phalcon\Mvc\Controller { public function indexAction(){ echo "admin/index"; } }
//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笔者后续学习中会继续分享。