# 框架基础知识 [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”); ```