模块分组
分组功能让模块更加独立,层次更加清晰,项目更方便管理,同时使LMLPHP框架在开发大型网站上奠定了坚实的基础。系统提供了强大的模块分组功能,分组后均加载各组别的控制器,模型层,显示层,各组别之间不会相互影响,系统支持多级目录分组。
分组配置
LMLPHP提供了addGroup方法添加分组功能,当URL中参数与定义的分组匹配上后则进入分组模块。下面将举例如何设置分组。
<?php
// after require LMLPHP
$group = array(
'blog'
);
lml()->app()
// add group
->addGroup($group)
// ...
->run(true);
?>
上面的例子添加了"blog"组别,当访问http://www.domain.com/blog或http://www.domain.com/{script_name}.php/blog时,即打中这个组别。组别名后面的URL对应为控制器名和方法名,它们默认的路由模式和系统未分组的URL模式一致。举个例子,当访问http://www.domain.com/blog/article/newest时,即定位到APP_PATH下面的module/blog/ModuleArticle.php的newest方法。
需要注意的是,系统分组配置后不仅仅支持PATH_INFO模式,同时还支持参数模式和普通模式。上面的例子通过访问http://www.domain.com/?path=/blog或者http://www.domain.com/?g=blog同样可以打中"blog"组别。更值得欣慰的是,LMLPHP分组完美支持CLI模式运行,CLI运行以第一个参数作为路径。如下示例:
php index.php /blog
分组路由配置
模块独立分组后,可以单独设置路由,也可以继承默认路由。关于分组路由需要特别的说明,比如访问http://www.domain.com/index.php/blog/test/abc,SCRIPT_URI为"/index.php/blog/test/abc"。当设置了blog分组并打中该分组后,系统为组别匹配路由时以"/index.php/test/abc"来进行匹配,所以在为组别设置路由时的正则无需包含组别名。下面将举例设置分组路由。
<?php
// after require LMLPHP
$group = array(
'blog'=>array(
'/^(?:\/index\.php)?\/test\/([a-z_\-]+)\/?([\d]*)/i' => array(
'param'=>array('name','id'),
// you can get value through $_GET['name'],$_GET['id']
// 'callback'=>array('ClassName','StaticMethodName'),
// or 'callback'=>array('funcname') ,
// if callback is set, m,a will not work.
'm'=>'test', // module name, without module prefix
'a'=>'index' // action name
)
)
);
lml()->app()
// add group
->addGroup($group)
// ...
->run(true);
?>
上面的例子为组别"blog"单独设置了路由。如果您需要继承系统默认路由,则只需将其设置为true即可,如下示例:
<?php
// after require LMLPHP
$group = array(
'blog'=>true
)
);
lml()->app()
// add group
->addGroup($group)
// ...
->run(true);
?>
多级分组配置
理论上,LMLPHP支持无限级分组,组别的设置的优先级按照设置的顺序进行匹配,最先匹配上的则打中该分组。当您要设置的组别前缀相同,则需要将组别名较长的放在前面,否则组别名较长的组别永远无法到达。例如,您要设置"test"和"test/abc"两个组别,则需要将"test/abc"放在前面。需要注意的是,系统对组别名中的"/"和"."进行了转义处理,并没有对其他的正则元字符处理,比如"["和"]",没有处理的是因为这种字符作为文件夹名称的比较少见。下面举例说明:
<?php
// after require LMLPHP
$group = array(
'test/abc'=>array(
// routers
),
'test'=>array(
// routers
)
);
lml()->app()
// add group
->addGroup($group)
// ...
->run(true);
?>
上面的例子设置了"test"和"test/abd"两个组别。
需要注意的是,系统addGroup方法在没有继承系统路由时(即没有将组别对应的路由设置为true时)会调用addRouter方法。所以当您不需要默认路由时就无需再次调用addRouter方法。