首先是命名空间,利用命名空间我们很方便的组织目录结构,而又不用担心自动加载效率和类冲突,假设我们的项目需要如下的模块化结构:
/
/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组件的实例$router4.通过$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笔者后续学习中会继续分享。