ThinkPHP

安装

官方已经不提供软件包下载了,采用Composer和git方式下载和更新

首先去官网下载composer,傻瓜安装之后,把你刚才添加的PHP的目录添加的系统PATH中,之后重启电脑,输入composer运行是否正常

接着在cmd中输入

1
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

配置好composer

切换到WWW目录下输入

1
composer create-project topthink/think=5.1.* tp5.1test

等待创建即可

创建完毕之后,访问http://localhost/thinkphp5/tp5.1test/public/

我是因为创建了thinkphp5,所以才有这样的目录,根据自身情况而进行修改,如果进去看到了ThinkPHP的默认界面,就成功创建了

如果你需要更新你的项目版本,进入根目录输入

1
composer update topthink/framework

接下来用编译器打开就行了

URL解析模式

  1. ThinkPHP框架非常多的操作都是通过URL来实现的

  2. http://serverName/index.php/模块/控制器/操作/参数/值

  3. index.php为入口文件,在public目录内的index.php文件

  4. 模块在application目录下默认有一个index目录,这就是一个模块

  5. 在index目录下有一个controller控制器目录的Index.php控制器

  6. Index.php控制器的类名也必须是class Index,否则错误

  7. 操作就是控制器class Index中的方法,比如index或hello

  8. 完整形式为public/index.php/index/index/index

创建一个自己的模块,在application中创建一个test模块,并且在下面创建必要的controller目录,接着创建Abc.php并在里面写上class Abc,别忘记命名空间

avatar

1
2
3
4
5
6
7
8
9
10
<?php
namespace app\test\controller;

class Abc{

public function eat($who='sindorei'){
return $who."吃饭";
}

}

浏览器访问http://localhost/thinkphp5/tp5.1test/public/index.php/test/abc/eat/who/

就会输出sindorei吃饭,还可以自己赋值

访问
http://localhost/thinkphp5/tp5.1test/public/index.php/test/abc/eat/who/51nd0re1

就会输出51nd0re1吃饭

上面的方法其实是由于开启了伪静态模式,进行的URL重写

如果所处环境没有开就只能使用PATH_INFO模式了
URL改为

1
http://localhost/thinkphp5/tp5.1test/public/index.php?s=test/abc/eat/who/51nd0re1

开启伪静态就在配置文件里,把mod_rewrite.so前面的#去掉

注意:PHP5.4以上版本的public目录下的.htaccess,需要把RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]改为RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]

模块设计

假如你只有一个test模块,就可以将public下的index.php中的方法改为

1
Container::get('app')->bind('test')->run()->send();

但是这样做就意味着绑定了这个test模块,就无法访问别的模块了

如果只有一个控制器,那就可以改为

1
Container::get('app')->bind('test/abc')->run()->send();

这直接访问就行http://localhost/thinkphp5/tp5.1test/public/eat

同理,其他控制器也无法访问了

空模块

在应用过程中,常常会出现用户访问不存在的模块,也就是空模块,这样的话就可以在config中的app.php的'empty_module'=> '' 在后面改为index,变为'empty_module'=>'index',就可以让用户访问空模块时转向index模块

修改完后,访问http://localhost/thinkphp5/tp5.1test/public/bbb

会发现自动转到了index模块,同时存在的模块也不会收到任何影响,也可以做一个error模块,让其知道该模块是错误的

单一模块

当只有一个模块的情况下,关闭多模块设置,就可以直接在app下创建controller并写一个Index.php

命名空间也变为 app\controller;

环境变量

提供了一个Env类库来获取环境变量

1
return \env('root_path');

系统路径 Env参数mingc
应用根目录 root_path
应用目录 app_path
框架目录 think_path
配置目录 config_path
扩展目录 extend_path
composer目录 vendor_path
运行缓存目录 runtime_path
路由目录 route_path
当前模块目录 module_path

控制器

控制器定义

  1. 控制器,即controller,控制器文件存放在controller目录下

  2. 类名和文件名大小写保持一致,并采用驼峰式(首字母大写) use think\Controller; class Index extends Controller

  3. 继承控制器基类,可以更方便使用功能,非必须

  4. 系统也提供了其他方法,在不继承的情况下完成相同功能

  5. 前面我们知道如果是一个单词,首字母大写,比如class Index

  6. URL访问时直接public/index即可

  7. 那么如果创建的是双字母组合,比如class HelloWorld,那么URL访问时必须为 public/hello_world

  8. 如果想要原样访问,可以在配置文件中关闭自动转换url_convert,这样就可以写成public/HelloWorld

  9. 如果想更改根命名空间app为其他,可以在根目录下创建.env文件,并且配上键值对 app_namespace=application

1
2
3
4
5
6
7
8
9
<?php
namespace app\index\controller;

class HelloWorld{
public function index(){
return 'HelloWorld';
}

}

URL访问
http://localhost/thinkphp5/tp5.1test/public/index/hello_world

渲染输出

  1. ThinkPHP直接采用方法内return返回的方式直接就输出了

  2. 使用json输出,直接采用json函数

    1
    2
    $data=array('a'=>1,'b'=>2,'c'=>3);
    return json($data);
  3. 使用view输出模板,开启错误提示,可知道如何创建模板,直接这样写会产生错误,打开错误提示根据错误提示的去创建相应的目录和文件即可

    1
    return view();
  4. 默认输出方式为html文件,如果返回的是数组,则会报错

  5. 一般来说,正常页面都是html输出,用于模板,Ajax默认为json

  6. 如果继承了积累控制器,那么可以定义控制器初始化方法为 initialize(),该方法会在调用控制器方法之前执行

    1
    2
    3
    4
    protected function initialize(){
    //parent::initialize();
    echo 'init';
    }
  7. initialize()方法不需要任何返回值,输出用PHP方式,return无效,该方法很像JavaWeb中的static模块

前置操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
namespace app\index\controller;
use think\Controller;

class Before extends Controller {
protected $beforeActionList=[
'first',
//one方法执行不调用
'second'=>['except'=>'one'],
//third前置只能通过调用one和two方法触发
'third'=>['only'=>'one,two']
];

protected function first(){
echo 'first</br>';
}

protected function second(){
echo 'second</br>';
}

protected function third(){
echo 'third</br>';
}

public function index(){
return 'index';
}

public function one(){
return 'one';
}

public function two(){
return 'two';
}

}

当什么方法都不调用时

1
2
3
first
second
index

当调用one方法时
1
2
3
first
third
one

当调用two方法时
1
2
3
4
first
second
third
two

跳转和重定向

  1. Controller类提供了两个跳转方法:success(msg,url)和error(msg)
1
2
3
4
5
6
7
8
9
public function index(){
if($this->flag){
//如果不指定url,则返回$_SERVER['HTTP_REFERER']
$this->success('成功','../');
}else{
//自动返回前一页
$this->error('失败');
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
namespace app\index\controller;
use think\Controller;

class Before extends Controller {
protected $beforeActionList=[
'first',
//one方法执行不调用
'second'=>['except'=>'one'],
//third前置只能通过调用one和two方法触发
'third'=>['only'=>'one,two']
];

protected $flag=false;

protected function first(){
echo 'first</br>';
}

protected function second(){
echo 'second</br>';
}

protected function third(){
echo 'third</br>';
}

public function index(){
if($this->flag){
$this->success('注册成功','../');
}else{
$this->error('失败');
}
return 'index';
}

public function one(){
return 'one';
}

public function two(){
return 'two';
}

}

运行结果

1
失败

因为这里flag为false,并且会自动跳转回原先访问的页面

现在将flag改为true,再次访问index方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
namespace app\index\controller;
use think\Controller;

class Before extends Controller {
protected $beforeActionList=[
'first',
//one方法执行不调用
'second'=>['except'=>'one'],
//third前置只能通过调用one和two方法触发
'third'=>['only'=>'one,two']
];

protected $flag=true;

protected function first(){
echo 'first</br>';
}

protected function second(){
echo 'second</br>';
}

protected function third(){
echo 'third</br>';
}

public function index(){
if($this->flag){
$this->success('注册成功','../');
}else{
$this->error('失败');
}
return 'index';
}

public function one(){
return 'one';
}

public function two(){
return 'two';
}

}

运行结果
1
注册成功

3秒后会跳转到上一层目录

  1. 成功或错误有一个固定的页面模板:’thinkphp/tpl/dispatch_jump.tpl’

  2. 在app.php配置文件中,我们可以更改自己个性化的跳转页面

    1
    2
    //默认跳转页面对应的模板文件
    'dispatch_success_tmpl'=>Env::get('think_path')
  3. 如果需要自定义跳转页面,可以使用如下模板变量

变量 说明
$data 要返回的数据
$msg 页面提示信息
$code 返回的code
$wait 跳转等待时间 单位为秒
$url 跳转页面地址

空方法拦截

这个只需要使用_empty函数即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
namespace app\index\controller;
use think\Controller;

class Before extends Controller {
protected $beforeActionList=[
'first',
//one方法执行不调用
'second'=>['except'=>'one'],
//third前置只能通过调用one和two方法触发
'third'=>['only'=>'one,two']
];

protected $flag=true;

protected function first(){
echo 'first</br>';
}

protected function second(){
echo 'second</br>';
}

protected function third(){
echo 'third</br>';
}


//空方法拦截
public function _empty($name){
return '此方法不存在:'.$name;
}


public function index(){
if($this->flag){
$this->success('注册成功','../');
}else{
$this->error('失败');
}
return 'index';
}

public function one(){
return 'one';
}

public function two(){
return 'two';
}

}

运行结果

1
2
3
first
second
此方法不存在:abc

同样是需要继承Controller类才能实现

空控制器拦截

访问空控制器同样会报错,需要创建一个Error类来进行处理

Error类

1
2
3
4
5
6
7
8
9
10
<?php
namespace app\index\controller;

use think\Request;

class Error{
public function index(Request $request){
return '此控制器不存在:'.$request->controller();
}
}

系统有默认的Error类,需要自定义的话,同样在app.php中修改