单入口文件的形式如下:
前端入口文件index.php
<?php
define('APP_NAME', 'Index');
define('APP_PATH', './Index/');
define('APP_DEBUG', TRUE);
include "./ThinkPHP/ThinkPHP.php";
?>
后端入口文件admin.php
<?php
define('APP_NAME', 'Admin');
define('APP_PATH', './Admin/');
define('APP_DEBUG', TRUE);
include "./ThinkPHP/ThinkPHP.php";
?>
上面这种方法实现两个项目存在于同一个应用中,其实是有弊端的。这两个项目其实是较为独立的,为了实现功能,我们有时候可能要写许多重复代码及重复文件(如common与tlp模板文件),做到代码公用比较麻烦。
TP应用分组
TP为我们实现了更好的项目组织方式即——应用分组。
要使用应用分组,可以分如下几个步骤:
1.仍然保持一个单入口文件,如我们可以叫做index.php。其内容如下
<?php
define('APP_NAME', 'APP');
define('APP_PATH', './App/');
define('APP_DEBUG', TRUE);
include "./ThinkPHP/ThinkPHP.php";
?>
这其实和上面是一样的,但我们并没有将项目分别叫做Index与Admin,而是用统一的名字APP
2.访问入口文件,TP生成应用目录。在Conf目录下的配置文件中,我们配置开启项目分组功能,如下
<?php
return array(
//开启项目分组
//开启分组
'APP_GROUP_LIST' => 'Index,Admin',
// 默认分组
'DEFAULT_GROUP' => 'Index',
//分组模式开启
'APP_GROUP_MODE' => 1,
//分组文件夹(即在项目目录的Modules文件夹下分别建立Index,Admin子文件夹做分组)
'APP_GROUP_PATH' => 'Modules'
);
?>
在上面的分组配置文件中,我们设定了两个项目分组,即Index,Admin。同时我们指定默认分组为Index。
3.在Modules目录下面分别建立Index和Admin文件夹,分别代表前台与后台程序。
Index和Admin文件夹下的子文件夹结构可以是和主项目目录结构一样的(但并非都是必须的,仅有Action文件夹是必须的)。此时,目录结构如下:
可以看出,其实这个目录结构和我们只有一个项目时是完全一样的。那么,我们该如何将Index与Admin两个项目分离呢?
很简单,只需要在配置的分组文件夹(此处名为Modules)下,分别建立名称为Index和Admin的子目录,TP框架会自动为我们寻找相应分组内容。
分组程序目录下的文件夹和主程序目录下的同名文件夹的关系是:
分组程序的目录设置会覆盖主程序目录设置,会共享主程序目录设置。
举个例子,比如在配置文件夹Conf下,我们有一些公共配置,需要两个项目共享。则在Conf目录下建立Config.php文件并写入内容。若针对不同项目的配置,则需要在Conf目录下再分别建立Index与Admin子文件夹,再在子文件夹下分别建立Config.php文件。
这样比如在Admin下我们配置了一个‘USER_NAME’=>'Admin',那么在Admin项目的控制器是可以通过C('USER_NAME')访问到其内容的,而在Index项目下则访问不到。但是若将‘USER_NAME’=>'Admin'写到Conf根目录下,则Admin,Index项目均可以访问USER_NAME。
关于应用分组所对应的文件夹规则,我们有两点需要注意:
1)应用分组后,对控制器文件夹的分组,是必须的。因此在分组目录下,必须为Admin和Index分别建立Action文件夹来存放不同分组的控制器。
2)对用Common文件夹下的函数文件,其功用函数文件名称为common.php,而分属于不同项目的函数文件名称则必须以function.php命名。
如下图所示
4.删除多余的文件夹
(1)删除主程序下Tpl文件夹(分组后,$this->display()函数会访问分组下的Tpl文件夹,因此公共Tpl文件没有意义)
(2)在主目录下的Lib/Action文件删除
5.在分组目录下建立Tpl文件夹,并为每个控制器分别建立子文件夹。如图,这是Admin分组的Tpl文件夹目录。
6.修改__PUBLIC__执行路径。因为在上面,我们在分组的Tpl文件夹下建立了Public文件夹来储存js,css,img等文件(TP默认是主程序根目录下的Public文件夹),因此我们要在配置文件里面修改。
这里要注意的是,分组后配置文件有两种,一个是主文件的配置文件,一个是分组的配置文件。因为我们现在是设置后台Admin分组的public目录(若设置为公共配置,则会影响前台Index的public目录),因此我们在Modules/Admin/Conf/Config.php文件中设置__PUBLIC__目录。
<?php
return array(
'TMPL_PARSE_STRING' => array(
'__PUBLIC__' => __ROOT__.'/'.APP_NAME.'/Modules/'.GROUP_NAME.'/Tpl/Public'),
);
?>
// 注意GROUP_NAME的使用,它会自动替换为当前分组的名称,此次为Admin
7.应用分组url访问规则
在创建应用分组后,除了遵循单项目的url访问规则,我们还必须在url中加上分组名称来区分要访问那个分组的内容。若不指定,则默认访问配置文件中默认分组的文件。
其url格式如下
http://127.0.0.1/wish/index.php/Admin/Index/handle
上面index.php是单一入口文件名称,Admin是Admin分组名称,Index为Admin项目分组Index控制器名称,handle为Index控制器handle函数。
若将Admin改为Index,即
http://127.0.0.1/wish/index.php/Index/Index/handle,则会访问Index项目的Index控制器的handle方法。
注意,这里同样符合TP默认url规则。如果我输入
http://127.0.0.1/wish/index.php/Admin,
则TP默认会寻找Admin项目的Index控制器的index方法。
GROUP_NAME关键字的使用
在TP中,我们免不了要提供文件的路径来供程序访问。而对于分组路径来说,我们可以通过GROUP_NAME关键字来表明当前分组的路径。即无论是同一个项目下的分组A还是分组B,我们都可以通过GROUP_NAME关键字来统一的提供分组的目录路径。