1、项目分为PC端、移动端、和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin;
对应入口文件为 index.php, mobile.php,admin.php,入口文件中设定绑定模块;
ThinkPHP配置>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> index.php // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',true); // 定义应用目录 define('APP_PATH','./Application/'); // 绑定模块 index.php define('BIND_MODULE','Home'); // 引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php'; // 亲^_^ 后面不需要任何代码了 就是如此简单 //-------------------------------------------------- admin.php // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',true); // 定义应用目录 define('APP_PATH','./Application/'); // 绑定模块 define('BIND_MODULE','Admin'); // 引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php'; // 亲^_^ 后面不需要任何代码了 就是如此简单 //-------------------------------------------------- mobile.php // 应用入口文件 // 检测PHP环境 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false define('APP_DEBUG',true); // 定义应用目录 define('APP_PATH','./Application/'); // 绑定模块 define('BIND_MODULE','Mobile'); // 引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php'; // 亲^_^ 后面不需要任何代码了 就是如此简单 //--------------------------------------------------
2、访问的URL为 “域名+项目文件夹名+入口文件+控制器+方法”,如“localhost/myprj/index.php/Index/index”;
3、服务器配置域名绑定到项目文件夹,省略项目文件名,服务器上URL为“www.myprj.com/index.php/Index/index”;
<VirtualHost *:80> ServerName myprj.com RedirectMatch permanent ^/(.*) http://www.myprj.com/$1 </VirtualHost> <VirtualHost *:80> ServerName www.myprj.com DocumentRoot "/usr/local/apache/htdocs/myprj" </VirtualHost>
4、对于三个模块的关系,我规划的是 PC端为父类,移动端和管理端均继承于PC端;
1、配置文件 /Application/Common/Conf/config.php为公共配置文件,用于配置数据库信息、模板后缀名、自动开启Session、URL模式等全项目公用的配置信息;
2、/Application/Home(或Mobile或Admin)/Conf/config.php为模块配置文件,一般用于配置CSS、JS、图片目录,如下
<?php return array( //'配置项'=>'配置值' 'TMPL_PARSE_STRING'=>array( '__CSS__' => __ROOT__.'/Public/home/css', '__JS__' => __ROOT__.'/Public/home/js', '__IMG__' => __ROOT__.'/Public/home/image', '__PCSS__' => __ROOT__.'/Public/pub/css', '__PJS__' => __ROOT__.'/Public/pub/js', '__PIMG__' => __ROOT__.'/Public/pub/image', ) );
备注1:在CSS中引用图片使用相对路径,如 body { background
: url("../image/bgimage.png") }
备注2:模板在包含文件时要使用<include file="..." />标签,使用<?php include '...'; ?>等原生PHP函数会导致包含文件中的__APP__、__JS__ 等预定义不被渲染;
备注3:模板在包含公共模板文件时使用<include file="Index:header"/>,对应的公共模板文件路径为 /View/Index/header.php ,此方法不经过控制器,所以不需要定义对应的方法,如果是其它控制器也不需要定义相对应的控制器。
3、/Application/Common/Common/function.php为公共函数文件,用于保存公共函数,如 密码加密函数、表单过滤函数 等,这个文件会被自动调用不需要手动 require;
备注:为移植第三方接口(如微信支付、支付宝支付、OAuth登录)修改工作较少,我把这些第三方DEMO放到了 /Application/Common/Common 目录下,在function.php中编写函数调用相关的接口类和函数。
4、设定模板文件的后缀名为php,因为一些IDE对html后缀的文件不能智能优化显示其中的php代码,比如Dreamweaver和Notepad++。
1、由于项目并不复杂,TP中提供了可不必定义的Model类,而如果定义Model类会在多模块的继承中增加复杂度,所以项目中均无定义Model类;可以看看一些开源项目中,不少Controller的方法只是对Model调用了一个方法然后ajax返回,非常冗余;
2、控制器分为两大类,一类是专门负责模板渲染(assign和display),这里称为模板控制器;另一类是负责数据库操作和处理,这里称为数据控制器;
3、为便于对于模板的统一控制,仅 Index 控制器为模板控制器;由于PC版有用户中心一系列的模板,所以 UserCenter也是模板控制器;
4、原则上所有的数据库操作不允许存在于模板控制器(如 Index控制器)中,应该写在相应对象的数据控制器中;
5、同理原则上模板赋值(assign)和模板渲染(display)不允许存在于数据控制器中
6、Ajax返回写在数据控制器中,对于同时支持被其它控制器和Ajax操作的方法,使用 $isReturn=FALSE 可选参数来决定输出数据还是函数返回数据;
1、文件、类、方法、函数命名规范参考Thinkphp官方规范
2、HTML/CSS、JS(jQuery)和PHP规范参考 这个链接>>
3、MySQL设计规范参考 这个链接>>
1、类实例化成对象变量的命名
控制器命名的规则是 $+类名首字母小写+字母C(表示控制器),即使只使用其中的一个方法也不要使用类中的方法名作为对象的名称。
控制器命名的规则是 $+类名首字母小写+字母M(表示模型),特别的空模型使用 $m,因为变量应该小写字母开头 。
$usrC = A('Usr'); $productC = A('Product'); $memberM = M('member'); $m = M(); 或者直接使用 M()->方法();
备注:实例化出来的类实例也是变量,变量名称就要以小写字母开头;
2、数据变量的命名
虽然PHP的变量类型有好多,但在数据显示方面,就基本上可以归纳为 字符串族 、一维数组族、多维数组族 这三种。
字符串族:整型、符点型、字符串,这一族可以直接使用 echo 或者类似Smarty的{$key} 等直接输出;
一维数组族:这种一般是查询数据库得出来的只有一行数据(通常需要类似 $userInfo = $userInfoArr[0] 的小处理一下),这种一般是 assign 到模板然后用类似 {$userInfo['name']} 这种方式输出;
多维数组族:这种一般是查询数据库得出来的多行数据,变量命名以Arr为后缀,如 $productArr = $productC->getIndexPro(); ,这种一般在模板用 foreach for 等循环遍历出来;
服务器上部署还可以启用TP的“REWRITE模式”,同时apache配置相应的域名对相应的入口文件,如 www.prj.com 到 index.php ,m.prj.com 到 mobile.php ,admin.prj.com 到 admin.php ,URL进一步缩写省去入口文件,如“www.myprj.com/Index/index”;
以下配置代码为本地模拟测试的。
1)Apache配置,不同的域名设置不同的首页文件
<VirtualHost *:80>
DocumentRoot "D:\wamp\www\batsing" ServerName www.batsing.com DirectoryIndex index.php </VirtualHost> <VirtualHost *:80> DocumentRoot "D:\wamp\www\batsing" ServerName m.batsing.com DirectoryIndex mobile.php </VirtualHost> <VirtualHost *:80> DocumentRoot "D:\wamp\www\batsing" ServerName admin.batsing.com DirectoryIndex admin.php </VirtualHost>
2) .htaccess文件配置(Apache专用,先开启rewrite_module)
<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On #设置用户端的重写规则,入口文件index.php,隐藏index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{HTTP_HOST} ^www.batsing.com$ [NC] RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] #设置移动端的重写规则,入口文件mobile.php,隐藏mobile.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{HTTP_HOST} ^m.batsing.com$ [NC] RewriteRule ^(.*)$ mobile.php/$1 [QSA,PT,L] #设置管理端的重写规则,入口文件admin.php,隐藏admin.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{HTTP_HOST} ^admin.batsing.com$ [NC] RewriteRule ^(.*)$ admin.php/$1 [QSA,PT,L] #404页重定向,框架外 ErrorDocument 404 /notfound.html #测试,指定浏览器 重定向URL (自动从www重定向到mobile) # RewriteCond %{HTTP_HOST} ^www.batsing.com$ [NC] # RewriteCond %{HTTP_USER_AGENT} "MicroMessenger" [NC,OR] #微信,其实并不需要特别指出的 # RewriteCond %{HTTP_USER_AGENT} "Mobile" [NC] #含Mobile字眼的浏览器(包括微信、UC移动、QQ移动、Safari移动、小米原生) # RewriteRule ^(.*)$ http://m.batsing.com/ [R=301,NC,L] #这一段放到httpd.conf去了,不用每次都读取.htaccess文件 </IfModule>
3) ThinkPHP的项目公共配置文件 /Application/Common/Config/config.php 增加一行开启URL访问模式为 2
'URL_MODEL' => 2, // URL访问模式,可选参数0、1、2、3
注解:设置URL模式是为了让系统生成的链接(如__APP__,__JS__等)不再包含index.php这一串,即使不修改thinkphp的url模式,也可以通过不带index.php的方式访问网页。
4)本地测试办法,修改hosts文件,配置相关的域名到本地
127.0.0.1 www.batsing.com
127.0.0.1 m.batsing.com 127.0.0.1 admin.batsing.com
参考这篇博文 Apache配置必配基础>>
利用URL重写规则,判断静态文件是否存在,存在则直接显示,否则定向到TP框架中处理;
覆盖重写TP中的display()方法,让其除了生成页面外,还生成静态页面;
需要静态化的页面在显示如用户名等通用信息时使用ajax获取;
具体配置和方法以后贴出,敬请期待。