采用ThinkPHP3.2.3框架开发网站快速入门
2015-10-22 12:31
756 查看
开发环境
[x] WampServer Version 2.4[x] ThinkPhp3.2.3
项目目录结构说明
www WEB部署目录(或者子目录) ├─index.php 前台应用入口文件 ├─admin.php 后台应用入口文件 ├─README.md README文件 ├─Application 默认应用目录(可以设置名字) │ ├─Common 公共模块(不能直接访问) │ ├─Runtime 默认运行时目录 │ ├─Admin 后台模块(添加模块) │ ├─Home 前台模块(添加模块) │ │ ├─User │ │ ├─Vip ├─Public 资源文件目录 │ ├─CSS CSS文件 │ │ │ ├─Admin │ │ ├─Home │ │ │ ├─User │ │ │ ├─Vip │ ├─JS JS文件 │ │ ├─Admin │ │ ├─Home │ │ │ ├─User │ │ │ ├─Vip │ ├─Images 图片文件 │ │ ├─Admin │ │ ├─Home │ │ │ ├─User │ │ │ ├─Vip │ ├─XXX 其他框架,如Excel、tcPDF等。 ├─ThinkPHP 框架系统目录(可以部署在非web目录下面) │ ├─Common 核心公共函数目录 │ ├─Conf 核心配置目录 │ ├─Lang 核心语言包目录 │ ├─Library 框架类库目录 │ │ ├─Think 核心Think类库包目录 │ │ ├─Behavior 行为类库目录 │ │ ├─Org Org类库包目录 │ │ ├─Vendor 第三方类库目录 │ │ ├─ ... 更多类库目录 │ ├─Mode 框架应用模式目录 │ ├─Tpl 系统模板目录 │ ├─LICENSE.txt 框架授权协议文件 │ ├─logo.png 框架LOGO文件 │ ├─README.txt 框架README文件 │ └─ThinkPHP.php 框架入口文件
注:3.2版本在原来3.1.3的独立分组的基础上进行了改进,改进后的独立分组就是新版的模块,之前的模块则改称为控制器。
每个模块是相对独立的,其目录结构如下:
├─Module 模块目录 │ ├─Conf 配置文件目录 │ ├─Common 公共函数目录 │ ├─Controller 控制器目录 │ ├─Model 模型目录 │ ├─Logic 逻辑目录(可选) │ ├─Service Service目录(可选) │ ... 更多分层目录可选 │ └─View 视图目录
注:上述应用的目录结构只是默认设置,事实上,在实际部署应用的时候,我们建议除了
应用入口文件和
Public资源目录外,其他文件都放到非WEB目录下面,具有更好的安全性。
拿到ThinkPHP框架后该怎么做?
通常情况下3.2无需使用多应用模式,因为大多数情况下,我们都可以通过
多模块化以及
多入口的设计来解决应用的扩展需求。
一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器。参见模块化设计:http://document.thinkphp.cn/manual_3_2/modules.html
注:模块化设计的思想下面模块是最重要的部分,模块其实是一个包含配置文件、函数文件和MVC文件(目录)的集合。
通过访问应用入口文件自动生成模块目录
例如,如果我们需要生成一个Admin模块用于后台应用,在应用入口文件中定义如下://绑定Admin模块到当前入口文件 define('BIND_MODULE','Admin'); define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
然后访问URL地址:
http://serverName/index.php
就会生成Admin模块的目录,并生成一个默认的控制器类
Admin\Controller\IndexController。更多参见:http://document.thinkphp.cn/manual_3_2/modules.html
注:生成模块目录可以复制一个模块目录,然后将相应的地方的模块名字改掉也可以;控制器的创建也是如此;
简化URL地址
3.2版本标准URL格式:http://serverName/index.php/模块/控制器/操作可以通过设置模块绑定或者域名部署等方式简化URL地址中的模块及控制器名称
ThinkPHP框架的URL默认是区分大小写(可设置,不过在Windows系统下大小写无关),到应用配置
Application/Common/Conf/config.php里配置为true。
项目设置为Rewrite模式,出现404错误:
打开Apache的httpd.conf
找到#LoadModule rewrite_module modules/mod_rewrite.so然后把前面的#去掉
找到所有的AllowOverride配置项,把所有的None都修改为All
应用入口文件同级目录下建立.htaccess文件,输入rewrite相应内容
无法加载控制器:Admin或Home
绑定完成后,并运行了入口文件,然后再去掉define('BIND_MODULE','Admin');即可。
自定义一个控制器的方法:
通过绑定模块的时候生成控制器
define(‘BIND_MODULE’,’Admin’);
define(‘BUILD_CONTROLLER_LIST’,’Index,User,Menu’);
或者直接复制黏贴一个控制器,然后将类名和文件名改好
自己手动调用Think\Build类的方法来生成模型类
\Think\Build::buildModel(‘Admin’,’User’);
控制器
一个典型的URL访问方式(REWRITE模式):http://serverName/模块/控制器/操作/[参数名/参数值...]
前面生成了一个Admin模块和一个默认的Home模块,里面的Controller都默认生成了一个Index控制器。在ThinkPHP里面,一般一个控制器就是一个类,而操作就是控制器里面的一个方法。
在控制器中:
- 始终给操作方法的参数定义默认值是一个避免报错的好办法
- 按照变量名进行参数绑定的参数必须和URL中传入的变量名称一致,但是参数顺序不需要一致
MVC
在MVC测试中遇到的一些问题:
Namespace declaration statement has to be the very first statement in the script
以UTF-8无BOM格式编码
连接数据库Mysql
三种方式,一种是通过配置文件定义数据库连接,这种方式一般是对于一个应用访问数据库是相同的,该方法系统在连接数据库的时候会自动获取,无需手动连接。还有就是通过模型类来连接。除了在模型定义的时候指定数据库连接信息外,我们还可以在实例化的时候指定数据库连接信息。这里通过配置文件来定义数据库连接,仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作了,在Application/Common/Conf/config.php里面添加:
'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => getenv("MOPAAS_MYSQL22118_HOST") ? getenv("MOPAAS_MYSQL22118_HOST") : 'localhost', // 服务器地址 'DB_NAME' => getenv("MOPAAS_MYSQL22118_NAME") ? getenv("MOPAAS_MYSQL22118_NAME") : 'yicm', // 数据库名 'DB_USER' => getenv("MOPAAS_MYSQL22118_USER") ? getenv("MOPAAS_MYSQL22118_USER") : 'root', // 用户名 'DB_PWD' => getenv("MOPAAS_MYSQL22118_PASSWORD") ? getenv("MOPAAS_MYSQL22118_PASSWORD") : 'xxxxxxxxx', // 密码 'DB_PORT' => getenv("MOPAAS_MYSQL22118_PORT") ? getenv("MOPAAS_MYSQL22118_PORT") : 3306 // 端口
则在控制器的操作里面进行实例化(参见:http://document.thinkphp.cn/manual_3_2/model_instance.html):
//实例化空模型 $Model = new Model(); //或者使用M快捷方法是等效的 $Model = M(); //进行原生的SQL查询 $Model->query('SELECT * FROM think_user WHERE status = 1');
一个登录的实例
用MVC中的VC实现登录,对于数据库连接,仅仅是使用原生SQL查询的话,不需要使用额外的模型类,实例化一个空模型类即可进行操作数据库了,因此VC足够满足需求。项目测试目录结构:
注:Admin模块和Home模块文件和目录结构一样,只是控制器名字空间不一样。
测试数据库设计
Application/Common/Conf/Config.php
<?php return array( //'配置项'=>'配置值' 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'MULTI_MODULE' => true, 'DEFAULT_MODULE' => 'Home', 'URL_CASE_INSENSITIVE' => true, //'DB_DSN' => 'mysql://root:ycm613740@localhost:3306/yicm#utf8', 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => getenv("MOPAAS_MYSQL22118_HOST") ? getenv("MOPAAS_MYSQL22118_HOST") : 'localhost', // 服务器地址 'DB_NAME' => getenv("MOPAAS_MYSQL22118_NAME") ? getenv("MOPAAS_MYSQL22118_NAME") : 'yicm', // 数据库名 'DB_USER' => getenv("MOPAAS_MYSQL22118_USER") ? getenv("MOPAAS_MYSQL22118_USER") : 'root', // 用户名 'DB_PWD' => getenv("MOPAAS_MYSQL22118_PASSWORD") ? getenv("MOPAAS_MYSQL22118_PASSWORD") : 'ycmxxxxxx', // 密码 'DB_PORT' => getenv("MOPAAS_MYSQL22118_PORT") ? getenv("MOPAAS_MYSQL22118_PORT") : 3306 // 端口 ); ?>
LoginController.class.php
<?php namespace Admin\Controller; use Think\Controller; class LoginController extends Controller { public function index(){ //配置页面显示内容 $this->assign('title','登录界面'); $this->display(); } //用户登录页面 public function login(){ header("Content-Type:text/html; charset=utf-8"); //首先检查验证码是否正确(验证码存在Session中) if(!$this->check_verify($_POST['verify'])){ $this->error('验证码不正确'); } $sql = "select * from admin where name = '%s' "; $db = M(); $data = M()->query($sql, $_POST['username']); if ($data) { return $this->success('用户名正确'); } else { return $this->error('用户名不对'); } } function verify(){ $Verify = new \Think\Verify(); $Verify->fontSize = 30; $Verify->length = 5; $Verify->useNoise = false; $Verify->entry(); } public function checklen($data){ if(strlen($data)>15 || strlen($data)<6){ return false; } return true; } // 检测输入的验证码是否正确,$code为用户输入的验证码字符串 private function check_verify($code, $id = ''){ $verify = new \Think\Verify(); return $verify->check($code, $id); } } ?>
登录界面
<script> function show(obj){ obj.src="__CONTROLLER__/verify/random/"+Math.random(); } </script> <form action="__URL__/login" method="POST"> <p> <label>用户名</label> <input type="text" name="username"/> </p> <p> <label>密码</label> <input type="password" name="password"/> </p> <p> <label>验证码</label> <input type="text" name="verify"/> <img src="__CONTROLLER__/verify"/ onclick="show(this)"> </p> <p id="remember-password"> <input type="checkbox" /> 记住我 </p> <p> <input class="button" type="submit" value="登录" /> </p> </form>
注:CSS和JS是放在Public目录里面的,通过VC的结合就可以实现项目了。有点类似ajax的味道,html是视图,数据交互通过控制器来实现。
测试源码下载地址:
http://download.csdn.net/detail/freeape/9202733
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- 插件管理框架 for Delphi(一)
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- 使用CSS框架布局的缺点和优点小结
- ASP.NET、ASP、PHP、JSP之间有什么区别?
- PHP VBS JS 函数 对照表