phalcon:使用路由和命名空间实现分组or模块化

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

/
/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控制器:

<?php
namespace admin\controller;
class IndexController extends \Phalcon\Mvc\Controller {
	public function indexAction(){
		echo "admin/index";
	}
}



我们的想法是:当我们访问 /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笔者后续学习中会继续分享。




你可能感兴趣的:(phalcon)