快速上手ThinkPHP 5.0

作者:陈中舒
时间:2017年5月11日

ThinkPHP 5.0的安装

方式一:官网下载

官网地址:http://thinkphp.cn

方式二:git安装

  1. 首先Clone项目仓库:
    git clone https://github.com/top-think/think project_name

  2. 然后再切换到项目文件夹(/project_name),安装核心框架
    git clone https://github.com/top-think/framework thinkphp

  3. 后续需要更新框架时,只要切换到thinkphp文件夹并执行
    git pull https://github.com/top-think/framework

运行ThinkPHP项目

  • 在本地环境运行ThinkPHP项目有两种方式:
  1. 在计算机上搭建Apache服务器,将项目文件夹放到Apache中运行
  2. 在安装php环境的机器上执行路由命令,自建服务器环境
  • 在此使用第一种方法,第二中方法占不讨论。
  • 在浏览器上访问入口文件,访问项目:http://localhost/project_name/public/index.php

配置数据库

  • 项目文件夹下有很多子文件夹,其中application文件夹存放的就是我们的业务代码,所以在入门的时候几乎只涉及到这个文件夹的内容。https://github.com/top-think/framework

  • 在开始制作项目前我们先配置数据库,用编辑器打开 database.php,修改数据库名称、用户名和密码就可以了。

'hostname'        => 'localhost',
'database'        => 'test',
'username'        => 'root',
'password'        => '123456',

了解目录的结构

  • application文件夹的目录结构是这样的
+ index //Index模块
    + controller //控制器
    + model //模型
    + view //视图
    - .htaccess
    - command.php //命令行工具配置
    - common.php //应用公共函数
    - config.php //应用公共配置
    - database.php //数据库配置
    - route.php //路由配置
    - tags.php //应用行为扩展定义
  • Index是系统为我们已经创建好的默认模块,我们还能为应用创建不同的模块,比如说后台Admin模块。
  • 从模块文件夹的结构我们明显地看出一个MVC的架构,而接下来我们要做的就是创建第一个控制器,模型和视图。

创建第一个控制器

  • 打开controller文件夹我们可以发现系统已经为我们创建了Index控制器,这也是我们为什么在项目创建完成后就可以通过浏览器访问的原因,在这里,我们创建一个新的控制器——Test控制器,我们在controller文件夹新建一个test.php文件。

  • test.php 代码如下

namespace app\index\controller;

class Test {
    public function index(){
        return 'Hello World!';
    }
}
  • namespace为这段代码划定了命名空间,避免了模块间和类库间的命名冲突。

  • index()是Test控制器的一个方法,当我们在通过URL访问时没有指定访问控制器的哪一个方法,就会默认访问index方法。

  • 当然也可以为控制器添加初始化方法 _initialize(),它会在控制器调用方法时前被调用。

  • 控制器一般不需要任何输出,直接return数据就可以了。

  • 现在我们访问 http://localhost/project_name/public/index.php/Index/Test/index 可以发现页面上输出了 Hello World!

  • 这里你应该就发现了URL的规律了,在index.php后面加上/模块名/控制器名/方法名就可以调用相应的方法了。

创建第一个视图

在服务器上展示一个网页

  • 在传统的PHP中,我们很容易就习惯把html和标签和php语句混到一起。而在MVC结构中,我们要把展现在浏览器上的部分和业务逻辑隔离开来,使得项目的可维护性更高。
  • ThinkPHP 5.0没有为我们建立视图文件夹,我们在index模块文件夹下建立一个view文件夹,然后在view文件夹下建立一个与控制器同名的Test文件夹,当控制器Test需要调用模板时,会在/index/view/Test中寻找。
  • 这里我们在Test下创建一个index.html文件:
<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <h1>Hello World!</h1>
</body>
</html>
  • 然后我们修改控制器的代码,引入think\View命名空间,并创建一个View的实例。
namespace app\index\controller;

use think\View;

class Test {

    public function index(){
        $view=new View();
        return $view->fetch('index');
    }

}
  • View类中的fetch方法会找到此模块中view文件夹下同名的Test文件夹,并根据参数找到index.html文件,将它渲染出来,这时访问
    http://localhost/project_name/public/index.php/Index/Test/index可以看到网页已经显示出来了。

  • 当然,如果方法和模板同名的话,就可以省略掉这个参数了,所以在这里
    return $view->fetch('index');
    可以写成
    return $view->fetch();

将变量输出到模板

  • 我们需要把控制器中处理后的数据输出到模板上,这时只要把变量绑定到$view对象成为它的属性,就可以在模板中用花括号中将它输出了。
    /index/controller/Test.php
<?php

namespace app\index\controller;

use think\View;

class Test {

    public function index(){
        
        $view=new View();
        $view->name='I love ThinkPHP';

        return $view->fetch();
    }

}

/index/view/Test/index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <h1>{$name}</h1>
</body>

</html>
  • 刷新页面,即可看到效果。

  • 在视图中,可以用点运算符(.)来访问数组的元素。
    /index/controller/Test.php

<?php

namespace app\index\controller;

use think\View;

class Test {

    public function index(){
        
        $view=new View();
        $view->person=array("name"=>"Tom","age"=>"23");

        return $view->fetch();
    }

}

/index/view/Test/index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <h1>{$person.name}</h1>
  <h1>{$person.age}</h1>
</body>

</html>
  • 当然也可以使用 {$person["name"]}{$person["age"]}

访问数据库

  • 在之前,我们已经配置好了数据库,假定我们现在有一张student表(id为主键)
    | id | name | age |
    | -- | ----- | --- |
    | 1 | Tom | 23 |
    | 2 | Alice | 22 |

  • 现在,在index文件夹下创建model文件夹,创建Student.php文件

<?php
namespace app\index\Model;

use think\Model;

class Student extends Model{
    protected $table="student";
}

这里注意Student模型类要继承think\Model类,我们可以事先通过use think\Model;来引入这个类。在Student类中,我们需要定义 $table 属性告诉 ThinkPHP 这个模型匹配的是 student 表。在这里你也许会想到要为 Student 类定义 id, name, age 这些属性,不过在这里并不需要,等你调用这个模型的时候,ThinkPHP 会根据数据表的字段为 Student 的实例来添加这些属性。

  • 接下来,我们只要在控制器中引入Student类,就可以访问数据了。
<?php

namespace app\index\controller;

use app\index\model\Student;
use think\View;

class Test {

    public function index(){
        
        $view=new View();   
        $student=Student::get(1);
        $view->student=$student;

        return $view->fetch();
    }

}
  • 首先别忘了引入Student类 use app\index\model\Student;
    在 index 方法中,我们通过 Student::get(1) 静态获取了 Student表中主键为1的数据,并将它绑定在视图上,我们尝试在视图输出 student 的数据。
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <h1>{$student.name}</h1>
  <h1>{$student.age}</h1>
</body>

</html>
  • 大功告成,除了这种静态调用的方式,还可以动态建立Student实例,这样就可以进行更加丰富的查询操作,这里就不详细撰述了,有兴趣的同学可以去翻看ThinkPHP 5.0文档中关于模型和数据库的部分。

成为一名ThinkPHP开发者

  • 在这里,你已经创建了一个ThinkPHP应用,建立了第一个控制器,通过关联模型访问了数据库的数据,并将它们输出到HTML模板上。你已经完成了开发ThinkPHP的第一步,当然,这些知识对于你而言还是远远不够的,接下来你需要通过更多的资料来熟悉这个框架,并通过不断地翻看文档,来了解ThinkPHP的各种方法和强大特性,最后附上ThinkPHP 5.0的文档地址,加油啦。
    http://www.kancloud.cn/manual/thinkphp5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容