0x01 目录结构
├─application 应用目录
│ ├─common 公共模块目录(可以更改)
│ ├─module_name 模块目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 公共函数文件
│ ├─config.php 公共配置文件
│ ├─route.php 路由配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─database.php 数据库配置文件
│
├─public WEB目录(对外访问目录)
│ ├─index.php 入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于apache的重写
│
├─thinkphp 框架系统目录
│ ├─lang 语言文件目录
│ ├─library 框架类库目录
│ │ ├─think Think类库包目录
│ │ └─traits 系统Trait目录
│ │
│ ├─tpl 系统模板目录
│ ├─base.php 基础定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 框架惯例配置文件
│ ├─helper.php 助手函数文件
│ ├─phpunit.xml phpunit配置文件
│ └─start.php 框架入口文件
│
├─extend 扩展类库目录
├─runtime 应用的运行时目录(可写,可定制)
├─vendor 第三方类库目录(Composer依赖库)
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
0x02 url解析
http://servername/index.php/模块/控制器/操作/参数/值
- 模块 : application目录下的目录
- 控制器:目录下的controller 首字母必须大写
- 操作:控制器下的方法
结构如下
自定义一个简单测试
url模式
在没有开启重写模式下
http://127.0.0.1/tp5.1/public/index.php?s=test/test1/eat
开启重写模式
apache:在 httpd.conf
中开启 mod_rewrite.so
http://127.0.0.1/tp5.1/public/index.php?s=test/test1/eat
http://127.0.0.1/tp5.1/public/index.php/test/test1/eat
修改 index.php
同级目录 .htaccess
文件
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>
http://127.0.0.1/tp5.1/public/index.php?s=test/test1/eat
http://127.0.0.1/tp5.1/public/index.php/test/test1/eat
http://127.0.0.1/tp5.1/public/test/test1/eat/
0x03 模块
│ ├─module_name 模块目录
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
模块下类库文件命名:app\模块名 eg:app\index\controller\Index
绑定模块
在只有test一个模块时,可以将其绑定,省略写法。可在 public/index.php
追加写法
默认格式:Container::get('app')->run()->send();
修改为:Container::get('app')->bind('test')->run()->send();
只有一个控制器同理 Container::get('app')->bind('test/test1')->run()->send();
空模块
'empty_module' => '', // 默认的空模块名
当模块名为空时跳到设置模块
单一模块
'app_multi_module' => false, //是否支持多模块
不支持时只能使用一个模块并且直接跳转
环境变量
类库 Env 来获取环境变量
use think\facade\Env;
0x04 控制器定义
当类名为大小写 如 HelloWorld 应该以hello_world访问 url不区分大小写
'app_debug' => true,
开启debug
自定义命名空间
在根目录下创建.env 文件 如果想想更改app为其他
在 .env文件中写入 app_namespace=application;
继承
可以继承控制器中的类,也可以进行重写
如Controller中的 initialize() 在访问控制器的时候就会执行
0x05 控制器操作
前置操作
继承 Controller
类后可以使用 $beforeActionList
属性来创建前置操作
<?php
namespace app\test\controller;
use think\Controller;
class Before extends Controller {
protected $beforeActionList = [
'first',
'second' => ['except' => 'one'],
'third' => ['only' => 'one,two']
];
protected function first(){
echo 'first ';
}
protected function second(){
echo 'second ';
}
protected function third(){
echo 'third ';
}
public function index(){
return 'index ';
}
public function one(){
return 'one ';
}
public function two(){
return 'two ';
}
}
跳转和重定向
Controller 类提供了两个跳转的方法,success(msg,url)和 error(msg)
public function index(){
if ($this->flag == true){
$this->success('登录成功!', '../index');
} else{
$this->error('登录失败');
}
}
默认固定模板 thinkphp/tpl/dispatch_jump.tpl
可以在app.php配置文件中更改个性化跳转页面
'dispatch_success_tmpl' => Env::get('think_path') .
'tpl/dispatch_jump.tpl',
'dispatch_error_tmpl' => Env::get('think_path') .
'tpl/dispatch_jump.tpl',
空方法
当方法为空时 可使用 _empty
public function _empty($name){
return '方法'.$name.'不存在';
}
空控制器
当访问了一个不存在的控制器时,系统也会报错,使用 Error 类来拦截 在Controller新建Error.php
<?php
namespace app\test\controller;
use think\Request;
use think\response\Redirect;
class Error
{
public function index(Request $r){
return '控制器 '.$r->controller().' 不存在';
}
}