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解析模式
ThinkPHP框架非常多的操作都是通过URL来实现的
index.php为入口文件,在public目录内的index.php文件
模块在application目录下默认有一个index目录,这就是一个模块
在index目录下有一个controller控制器目录的Index.php控制器
Index.php控制器的类名也必须是class Index,否则错误
操作就是控制器class Index中的方法,比如index或hello
完整形式为public/index.php/index/index/index
创建一个自己的模块,在application中创建一个test模块,并且在下面创建必要的controller目录,接着创建Abc.php并在里面写上class Abc,别忘记命名空间
1 |
|
浏览器访问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 |
控制器
控制器定义
控制器,即controller,控制器文件存放在controller目录下
类名和文件名大小写保持一致,并采用驼峰式(首字母大写) use think\Controller; class Index extends Controller
继承控制器基类,可以更方便使用功能,非必须
系统也提供了其他方法,在不继承的情况下完成相同功能
前面我们知道如果是一个单词,首字母大写,比如class Index
URL访问时直接public/index即可
那么如果创建的是双字母组合,比如class HelloWorld,那么URL访问时必须为 public/hello_world
如果想要原样访问,可以在配置文件中关闭自动转换
url_convert
,这样就可以写成public/HelloWorld如果想更改根命名空间app为其他,可以在根目录下创建.env文件,并且配上键值对 app_namespace=application
1 |
|
URL访问
http://localhost/thinkphp5/tp5.1test/public/index/hello_world
渲染输出
ThinkPHP直接采用方法内return返回的方式直接就输出了
使用json输出,直接采用json函数
1
2$data=array('a'=>1,'b'=>2,'c'=>3);
return json($data);使用view输出模板,开启错误提示,可知道如何创建模板,直接这样写会产生错误,打开错误提示根据错误提示的去创建相应的目录和文件即可
1
return view();
默认输出方式为html文件,如果返回的是数组,则会报错
一般来说,正常页面都是html输出,用于模板,Ajax默认为json
如果继承了积累控制器,那么可以定义控制器初始化方法为 initialize(),该方法会在调用控制器方法之前执行
1
2
3
4protected function initialize(){
//parent::initialize();
echo 'init';
}initialize()方法不需要任何返回值,输出用PHP方式,return无效,该方法很像JavaWeb中的static模块
前置操作
1 |
|
当什么方法都不调用时1
2
3first
second
index
当调用one方法时1
2
3first
third
one
当调用two方法时1
2
3
4first
second
third
two
跳转和重定向
- Controller类提供了两个跳转方法:success(msg,url)和error(msg)
1 | public function index(){ |
1 |
|
运行结果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
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秒后会跳转到上一层目录
成功或错误有一个固定的页面模板:’thinkphp/tpl/dispatch_jump.tpl’
在app.php配置文件中,我们可以更改自己个性化的跳转页面
1
2//默认跳转页面对应的模板文件
'dispatch_success_tmpl'=>Env::get('think_path')如果需要自定义跳转页面,可以使用如下模板变量
变量 | 说明 |
---|---|
$data | 要返回的数据 |
$msg | 页面提示信息 |
$code | 返回的code |
$wait | 跳转等待时间 单位为秒 |
$url | 跳转页面地址 |
空方法拦截
这个只需要使用_empty
函数即可
1 |
|
运行结果1
2
3first
second
此方法不存在:abc
同样是需要继承Controller类才能实现
空控制器拦截
访问空控制器同样会报错,需要创建一个Error类来进行处理
Error类1
2
3
4
5
6
7
8
9
10
namespace app\index\controller;
use think\Request;
class Error{
public function index(Request $request){
return '此控制器不存在:'.$request->controller();
}
}
系统有默认的Error类,需要自定义的话,同样在app.php中修改