采用ThinkPHP3.2.3框架开发网站快速入门

开发环境

  • [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

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
 
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

你可能感兴趣的:(php5)