# 框架基础知识
[TOC]
## 目录结构
project 应用部署目录
2.├─application 应用目录(可设置)
3.│ ├─common 公共模块目录(可更改)
4.│ ├─index 模块目录(可更改)
5.│ │ ├─config.php 模块配置文件
6.│ │ ├─common.php 模块函数文件
7.│ │ ├─controller 控制器目录
8.│ │ ├─model 模型目录
9.│ │ ├─view 视图目录
10.│ │ └─ ... 更多类库目录
11.│ ├─command.php 命令行工具配置文件
12.│ ├─common.php 应用公共(函数)文件
13.│ ├─config.php 应用(公共)配置文件
14.│ ├─database.php 数据库配置文件
15.│ ├─tags.php 应用行为扩展定义文件
16.│ └─route.php 路由配置文件
17.├─extend 扩展类库目录(可定义)
18.├─public WEB 部署目录(对外访问目录)
19.│ ├─static 静态资源存放目录(css,js,image)
20.│ ├─index.php 应用入口文件
21.│ ├─router.php 快速测试文件
22.│ └─.htaccess 用于 apache 的重写
23.├─runtime 应用的运行时目录(可写,可设置)
24.├─vendor 第三方类库目录(Composer)
25.├─thinkphp 框架系统目录
26.│ ├─lang 语言包目录
27.│ ├─library 框架核心类库目录
28.│ │ ├─think Think 类库包目录
29.│ │ └─traits 系统 Traits 目录
30.│ ├─tpl 系统模板目录
31.│ ├─.htaccess 用于 apache 的重写
32.│ ├─.travis.yml CI 定义文件
33.│ ├─base.php 基础定义文件
34.│ ├─composer.json composer 定义文件
35.│ ├─console.php 控制台入口文件
36.│ ├─convention.php 惯例配置文件
37.│ ├─helper.php 助手函数文件(可选)
38.│ ├─LICENSE.txt 授权说明文件
39.│ ├─phpunit.xml 单元测试配置文件
40.│ [├─README.md](http://xn--README-2n7cpi.md) README 文件
41.│ └─start.php 框架引导文件
42.├─build.php 自动生成定义文件(参考)
43.├─composer.json composer 定义文件
44.├─LICENSE.txt 授权说明文件
[45.├─README.md](http://45.xn--README-2n7cpi.md) README 文件
46.├─think 命令行入口文件
## 配置文件
在Tinkphp中的配置加载的顺序
惯例配置->应用配置->扩展配置->场景配置->模块配置->动态配置
框架主配文件(惯性配置) thinkphp/convention.php 最顶层
应用公共配置文件 application/config.php application/database.php 对整个应用生效
模块配置只对当前模块生效
自定义配置文件 `自定义配置文件需要修改入口文件,代码如下`
玩转配置文件只需要记住:`think/Config.php类` 或者 `config`助手函数
配置文件的格式:
```
//正常配置文件
return [
'template' =>[
'layout_on' => true,
'layout_name' => 'layout',
],
];
//自定义配置文件,需要修改入口文件
define('CONF_PATH', __DIR__ . '/../config/');
define('CONF_EXT', '.ini[xml][json]');
//动态配置文件
think\Config::set('peizhi','我是动态配置');
```
配置文件生效的顺序:最先加载的会被最后加载的覆盖掉(`也就是最后加载的生效`),一般我们不会去操作框架主配,而是操作应用和模块配置文件。
## 函数文件
框架函数文件 thinkphp/helper.php
公共应用函数文件 application/common.php
模块函数文件 application/模块目录/common.php
与配置文件一样,都不建议去修改主程,而是去修改应用于模块的函数文件。在那种情况下我们会使用到函数文件呢?比如我们需要去加密我们的密码,那么就可以把它写成一个公共的函数方便使用。
函数文件的格式:
```
if(!function_exists('FunMd5'))
{
function FunMd5($password)
{
$str = '我热爱着我的祖国,我爱中国';
return md5(md5($password).$str);
}
}
```
## 命名空间
PHP5.3加入命名空间,命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,**Thinkphp中的命名空间通常与目录关联一起。Tinkphp中的自动加载机制会把类的命名空间做成加载的一部分**。
Thinkphp中命名空间使用:
* [ ] 声明命名空间 使用namespace关键字
* [ ] 引入指定的类 使用use关键字 命名空间\\类名称
* [ ] 完全限定式访问 在使用类时,\\完整命名空间\\类名称(继承和实例化)
* [ ] 如果一个类没有命名空间,使用 \\类名
## 隐藏入口文件
ThinkphpURL采用的PATH\_INFO方式 URL访问的格式:[http://域名/入口文件/模块名/控制器名称/操作方法名称/参数名/参数值](http://xn--eqrt2g/%E5%85%A5%E5%8F%A3%E6%96%87%E4%BB%B6/%E6%A8%A1%E5%9D%97%E5%90%8D/%E6%8E%A7%E5%88%B6%E5%99%A8%E5%90%8D%E7%A7%B0/%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95%E5%90%8D%E7%A7%B0/%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC)
在ThinkPHP5.0中,出于优化的URL访问原则,还支持通过URL重写隐藏入口文件,在对外访问目录pulibc/.htaccess,我们可以修改它从而实现隐藏入口文件。注意一点Thinkphp5.0版本已经不再支持传统的URL访问模式。
修改后的代码:
```
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?(实践上就是在这里加上一个?)/$1 [QSA,PT,L]
</IfModule>
```
重新URL后我们访问就不在需要入口文件了,那么又有一个问题在我们URL访问时URL区分大小写嘛?默认是不区分大小写的,如有需求可以修改application/config.php里面的配置关闭URL的自动转换。
关闭URL的自动转换:
```
'url_convert' => false,
```
## 调试模式
开发时应当开启调试模式,这样有利于我们的开发。在5.0.10以前调试模式是自动开始前的,5.0.10+以后需要手动开启。且注意:调试模式开启为全局作用,不支持单独开启。在application/config.php开启调试模式
开始调试模式:
```
// 应用调试模式
'app_debug' => true
// trace 调试模式
'app_trace' => true
```
## 设置默认访问模块
我们打开URL访问入口文件,没有控制器与方法也能正常访问就是利用了Thinkphp中提供的默认模块。application/config.php可以修改默认访问的模块。
修改默认访问模块:
```
// 默认模块名
'default_module' => 'home',
// 禁止访问模块
'deny_module_list' => ['common'],
// 默认控制器名
'default_controller' => 'Index',
// 默认操作名
'default_action' => 'index',
```
## 配置数据库连接信息
在Thinkphp中数据库的连接是通过修改配置文件来设置的,在application/database.php修改
```
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'my',
// 用户名
'username' => 'root',
// 密码
'password' => 'root',
// 端口
'hostport' => '3306',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'my_',
// 自动写入时间戳字段
'auto_timestamp' => true,
#如果开启了时间戳自动写入,那么数据表中必须添加二个字段:create_time和update_time
如果有表名跟配置项的不一致,thinkphp也为我们提供了一个$table属性来设置完整表名称
class User
{
protected $table = '完整的表名称';
}
```
## 页面重定向
详细见手册:控制器->跳转与重定向
```
// 成功时跳转
$this -> success(“提示信息”,“跳转地址”,“返回数据”,“等待时间”,“header信息”);
// 失败时跳转 等待时间默认3s。 跳转地址可以不写,默认跳转回上一页
$this -> error(“提示信息”,“跳转地址”,“返回数据”,“等待时间”,“header信息”);
// 重定向跳转:用于直接跳转,不显示提示信息。
$this -> redirect(“跳转地址”,“请求参数”,“http code”);
```
- 基础
- 安装PHP
- 语言基础
- 变量
- 变量操作
- 超全局数组变量
- 变量作用域
- 变量传值方式
- 常量
- 数据类型
- 运算符
- 流程控制
- 文件包含
- 错误处理
- 字符串操作
- 数组
- 函数
- 进阶
- 面向对象
- 提高
- TP
- 安装项目
- 框架基础知识
- 命令创建模块
- URL生命周期
- 路由操作
- Request请求类
- 参数绑定
- 依赖注入
- 模板操作
- 查询操作
- 添加操作
- laravel
- ☆目录结构
- CSRF攻击
- ☆路由
- ☆控制器
- ☆请求类
- ☆视图
- ☆模板继承
- ☆表单验证
- ☆DB类
- ☆模型
- ☆数据库迁移
- 类型、修饰、索引
- ☆数据填充
- ☆数据分页
- ☆session处理
- ☆中间件
- ☆缓存操作
- ☆文件上传
- ☆接口操作
- ☆扩展插件
- restful
- 工作
- 工作记录
- QQ登录
- 新浪登录
- 微信登录
- sphinx搜索
- 数据库
- MySQL
- ☆数据库操作
- ☆数据表操作
- ☆数据的操作
- 待修改
- 优化
- 存储引擎选择
- 列表类型选择
- 范式
- 慢日志查询
- 精准时间记录查询
- 计划任务 explain
- 索引
- 索与事务
- 查询缓存
- 存储过程
- 触发器
- 分区
- 分表
- sphinx
- 读写分离
- 搜索优化
- 网站静态化
- Memcache
- Mongodb
- Readis
- php使用redis
- 服务器
- Linux
- 目录结构
- 常用命令
- VIM编辑器
- 用户与用户组
- 权限管理
- 运行级别
- 网络模式
- ssh
- 软件安装
- 计划任务
- Ubuntu
- 编译PHP7.3
- 编译MySQL
- 编译Nginx
- apache虚拟机配置
- 安装composer
- Nginx
- Git