一、基础

project 应用部署目录

├─application 应用目录(可设置)

│ ├─common 公共模块目录(可更改)

│ ├─index 模块目录(可更改)

│ │ ├─config.php 模块配置文件

│ │ ├─common.php 模块函数文件

│ │ ├─controller 控制器目录

│ │ ├─model 模型目录

│ │ ├─view 视图目录

│ │ └─ ... 更多类库目录

│ ├─command.php 命令行工具配置文件

│ ├─common.php 应用公共(函数)文件

│ ├─config.php 应用(公共)配置文件

│ ├─database.php 数据库配置文件

│ ├─tags.php 应用行为扩展定义文件

│ └─route.php 路由配置文件

├─extend 扩展类库目录(可定义)

├─public WEB 部署目录(对外访问目录)

│ ├─static 静态资源存放目录(css,js,image)

│ ├─index.php 应用入口文件

│ ├─router.php 快速测试文件

│ └─.htaccess 用于 apache 的重写

├─runtime 应用的运行时目录(可写,可设置)

├─vendor 第三方类库目录(Composer)

├─thinkphp 框架系统目录

│ ├─lang 语言包目录

│ ├─library 框架核心类库目录

│ │ ├─think Think 类库包目录

│ │ └─traits 系统 Traits 目录

│ ├─tpl 系统模板目录

│ ├─.htaccess 用于 apache 的重写

│ ├─.travis.yml CI 定义文件

│ ├─base.php 基础定义文件

│ ├─composer.json composer 定义文件

│ ├─console.php 控制台入口文件

│ ├─convention.php 惯例配置文件

│ ├─helper.php 助手函数文件(可选)

│ ├─LICENSE.txt 授权说明文件

│ ├─phpunit.xml 单元测试配置文件

│ ├─README.md README 文件

│ └─start.php 框架引导文件

├─build.php 自动生成定义文件(参考)

├─composer.json composer 定义文件

├─LICENSE.txt 授权说明文件

├─README.md README 文件

├─think 命令行入口文件

3、入口文件

默认自带的入口文件位于public/index.php

// 定义应用目录

define('APP_PATH', __DIR__ . '/../application/');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

4、资源访问

访问资源问件是不会影响正常的操作访问,只有当资源不存在时才会解析到入口问件,一般提示模块不存在。

资源文件一般放在public目录的子目录下,不要在public目录外的任何位置放置资源文件。

public

├─index.php 应用入口文件

├─static 静态资源目录

│ ├─css 样式目录

│ ├─js 脚本目录

│ └─img 图像目录

5、控制器

当访问一个驼峰命名的控制器时,在url中输入大写的控制器名称会报错,因为默认的URL访问是不区分大小写的,全部都会转换为小写的控制器名。

namespace app\index\controller;

class HelloWorld

{

public function index($name = 'World')

{

return 'Hello,' . $name . '!';

}

}

//直接用http://http://localhost/public/index/HelloWorld访问会报错,控制器不存在

//应该用http://http://localhost/public/index/hello_world访问

//除非在配置文件中设置了关闭url自动转换'url_convert' => false

//通过在url中添加参数来为控制器中的操作方法传递参数http://http://localhost/public/?name=php

如果控制器命名方式是驼峰的,在进行访问时必须改为小写;如果控制器中的操作方法是private和protect类型时,无法直接通过url访问到该操作。

6、视图

在给控制器添加视图文件功能时,首先在该模块下创建view目录,然后添加模板文件view/inde/hello.html

hello {$name}

hello, {$name}!

在控制器方法中进行模板渲染输出操作

namespace app\index\controller;

use think\Controller;

class Index extends Controller

{

public function hello($name = 'thinkphp')

{

$this->assign('name', $name);

return $this->fetch();

}

}

用use导入类库,Index可以直接继承,并直接使用封装好的assign和fetch方法进行模板变量赋值和渲染输出。

二、URL和路由

1、参数传入

以hello方法为例,可以直接在url中添加参数

http://tp5.com/index.php/index/index/hello/name/thinkphp

当需要传入两个参数时,继续在url中添加参数,可以有两种方式

http://tp5.com/index.php/index/index/hello/name/thinkphp/city/shanghai

http://tp5.com/index.php/index/index/hello?city=shanghai&name=thinkphp

还可以进一步对URL地址做简化,前提就是我们必须明确参数的顺序代表的变量,我们更改下URL参数的获取方式,把应用配置文件中的“url_param_type=>1”,此时必须严格按照参数的顺序进行添加。

2、定义路由

在application/route.php定义路由,可以通过直接返回一个数组形式定义路由,也可以通过think的Route类来动态定义路由规则,两者可以混用。一旦定义路由规则,以前的url将会失效。

return [

// 路由参数name为可选,[]表示参数为可选

'hello/[:name]' => 'index/hello',

];

3、完美匹配

上面定义的路由只要是以hello开头的都可以进行匹配,在路由规则后加上$符号,表示完美匹配,只匹配次个hello方法。

return [

// 路由参数name为可选

'hello/[:name]$' => 'index/hello',

];

//http://tp5.com/hello // 正确匹配

//http://tp5.com/hello/thinkphp // 正确匹配

//http://tp5.com/hello/thinkphp/val/value // 不会匹配

4、闭包定义

定义一些特殊需求的路由,不用执行控制器里的方法。

return [

// 定义闭包

'hello/[:name]' => function ($name) {

return 'Hello,' . $name . '!';

},

];

5、路由参数

return [

// 定义路由的请求类型和后缀

'hello/[:name]' => ['index/hello', ['method' => 'get', 'ext' => 'html']],

];

//http://tp5.com/hello // 无效

//http://tp5.com/hello.html // 有效

//http://tp5.com/hello/thinkphp // 无效

//http://tp5.com/hello/thinkphp.html // 有效

6、变量规则

用正则的方式指定变量规则,弥补了动态变量无法限制具体的类型问题。

namespace app\index\controller;

class Blog

{

public function get($id)

{

return '查看id=' . $id . '的内容';

}

public function read($name)

{

return '查看name=' . $name . '的内容';

}

public function archive($year, $month)

{

return '查看' . $year . '/' . $month . '的归档内容';

}

}

路由规则

return [

'blog/:year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],

'blog/:id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']],

'blog/:name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],

];

7、路由分组

如上路由拥有相同的前缀,可以将其进行分组,路由分组一定程度上可以提高路由检测的效率。

return [

'[blog]' => [

':year/:month' => ['blog/archive', ['method' => 'get'], ['year' => '\d{4}', 'month' => '\d{2}']],

':id' => ['blog/get', ['method' => 'get'], ['id' => '\d+']],

':name' => ['blog/read', ['method' => 'get'], ['name' => '\w+']],

],

];

三、请求与相应

1、请求对象

Request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。获取url:

传统方法:

public function hello($name = 'World')

{

$request = Request::instance();

// 获取当前URL地址 不含域名

echo 'url: ' . $request->url() . '
';

return 'Hello,' . $name . '!';

}

继承think\Controller:

class Index extends Controller

{

public function hello($name = 'World')

{

// 获取当前URL地址 不含域名

echo 'url: ' . $this->request->url() . '
';

return 'Hello,' . $name . '!';

}

}

自动注入请求对象:

public function hello(Request $request, $name = 'World')

{

// 获取当前URL地址 不含域名

echo 'url: ' . $request->url() . '
';

return 'Hello,' . $name . '!';

}

2、动态绑定属性

通过给Request请求对象绑定属性,方便全局调用,首先定义一个新建一个控制器,给Request请求对象绑定属性,以后的控制器可以通过继承该控制器直接调用其属性。

class Base extends Controller

{

public function _initialize()

{

$user = User::get(Session::get('user_id'));

Request::instance()->bind('user',$user);

}

}

class Index extends Base

{

public function index(Request $request)

{

echo $request->user->id;

echo $request->user->name;

}

}

3、助手函数

如果既没有继承think\Controller也不想给操作方法添加额外的Request对象参数,那么也可以使用系统提供的助手

class Index

{

public function hello($name = 'World')

{

// 获取当前URL地址 不含域名

echo 'url: ' . request()->url() . '
';

return 'Hello,' . $name . '!';

}

}

4、获取请求参数

使用param方法统一获取当前请求变量,该方法最大的优势是让你不需要区分当前请求类型而使用不同的全局变量或者方法,并且可以满足大部分的参数需求。

class Index

{

public function hello(Request $request)

{

echo '请求参数:';

dump($request->param());

echo 'name:'.$request->param('name');

}

}

通过input助手函数简化Request对象的param方法。

class Index

{

public function hello()

{

echo '请求参数:';

dump(input());

echo 'name:'.input('name');

}

}

param方法获取参数会自动判断当前请求,参数优先级为:路由变量 > 当前请求变量(

_GET变量。除了param方法外,还可以通过get、post、cookie、file方法获取参数。

获取参数信息:

class Index

{

public function hello(Request $request)

{

echo '请求方法:' . $request->method() . '
';

echo '资源类型:' . $request->type() . '
';

echo '访问IP:' . $request->ip() . '
';

echo '是否AJax请求:' . var_export($request->isAjax(), true) . '
';

echo '请求参数:';

dump($request->param());

echo '请求参数:仅包含name';

dump($request->only(['name']));

echo '请求参数:排除name';

dump($request->except(['name']));

}

}

获取URL信息:

class Index

{

public function hello(Request $request,$name = 'World')

{

// 获取当前域名

echo 'domain: ' . $request->domain() . '
';

// 获取当前入口文件

echo 'file: ' . $request->baseFile() . '
';

// 获取当前URL地址 不含域名

echo 'url: ' . $request->url() . '
';

// 获取包含域名的完整URL地址

echo 'url with domain: ' . $request->url(true) . '
';

// 获取当前URL地址 不含QUERY_STRING

echo 'url without query: ' . $request->baseUrl() . '
';

// 获取URL访问的ROOT地址

echo 'root:' . $request->root() . '
';

// 获取URL访问的ROOT地址

echo 'root with domain: ' . $request->root(true) . '
';

// 获取URL地址中的PATH_INFO信息

echo 'pathinfo: ' . $request->pathinfo() . '
';

// 获取URL地址中的PATH_INFO信息 不含后缀

echo 'pathinfo: ' . $request->path() . '
';

// 获取URL地址中的后缀信息

echo 'ext: ' . $request->ext() . '
';

return 'Hello,' . $name . '!';

}

}

获取当前模块/控制器/操作信息:

public function hello(Request $request, $name = 'World')

{

echo '模块:'.$request->module();

echo '
控制器:'.$request->controller();

echo '
操作:'.$request->action();

}

5、响应对象——自动输出

一般情况下,不需要关注Response对象本身,只需要在控制器的操作方法中返回数据即可,系统会自动判断是否为Ajax请求,是的话自动输出default_ajax_return配置的输出类型,否则自动输出default_return_type匹配的输出类型。

namespace app\index\controller;

class Index

{

public function hello()

{

$data = ['name' => 'thinkphp', 'status' => '1'];

//通过手动添加参数的控制,来输出不同格式的参数,无需更改配置文件

//return json($data);

return $data;

}

}

默认情况下输出是html输出。因此上述代码会报错,只有更改配置文件后,才能正常输出。

// 默认输出类型

'default_return_type' => 'json',

输出类型 快捷方法

渲染模板输出 view

JSON输出 json

JSONP输出 jsonp

XML输出 xml

页面重定向 redirect

6、页面跳转

namespace app\index\controller;

class Index

{

use \traits\controller\Jump;

public function index($name='')

{

if ('thinkphp' == $name) {

$this->success('欢迎使用ThinkPHP

5.0','hello');

} else {

$this->error('错误的name','guest');

}

}

public function hello()

{

return 'Hello,ThinkPHP!';

}

public function guest()

{

return 'Hello,Guest!';

}

}

7、页面重定向

namespace app\index\controller;

class Index

{

use \traits\controller\Jump;

public function index($name='')

{

if ('thinkphp' == $name) {

$this->redirect('http://thinkphp.cn');

} else {

$this->success('欢迎使用ThinkPHP','hello');

}

}

public function hello()

{

return 'Hello,ThinkPHP!';

}

}

在没有引入Jump trait的情况下,可以使用助手函数redirect函数进行重定向。

namespace app\index\controller;

class Index

{

public function index($name='')

{

if ('thinkphp' == $name) {

return redirect('http://thinkphp.cn');

} else {

return 'Hello,ThinkPHP!';

}

}

}

tp5 post html,TP5基础相关推荐

  1. 关于TP5.1框架一些基础知识小结

    文章目录 默认入口文件 TP5支持的URL模式 URL大小写问题 响应输出 使用框架类方法读取配置文件注意事项(TP5.1) TP5.1配置文件优先级 Thinkphp概念个人理解 默认入口文件 首先 ...

  2. tp5 queue.php,tp5(think-queue)消息队列+supervisor进程管理实现队列常驻进程

    前言 传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题.在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费 ...

  3. tp5 database.php,Tp5项目修改数据库

    这篇文章主要介绍了关于Tp5项目修改数据库,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下设置model<?php namespace app\home\model; use th ...

  4. tp5 linux定时,TP5 用cron实现linux定时任务

    TP5 用cron实现linux定时任务 1) tp5的控制器内容: namespace app\test\controller; usethink\Controller; use think\fac ...

  5. php tp5修改语句,tp5修改(实现即点即改)

    效果如下所示: 点击修改时把想修改的变成input框 实现代码如下:根据自己实际情况修改即可. $(document).on('click','.xiu',function(){ old_val=$( ...

  6. tp5怎么引用.css.php,tp5分页css tp5怎么引入css,js文件

    $Page = new Page($count,5);// 实例化分页类 传入总记录数和每页显示的记录数 thinkphp5中直接调用分页为什么样式是竖排的啊? tp5怎么实现搜索分页能保留搜索条件 ...

  7. tp5 Loader.php,tp5集成swoole 报错 argv in /var/www/tp5/thinkphp/library/think/Loader.php:61

    PHP Fatal error:  Uncaught think\exception\ErrorException: Undefined index: argv in /var/www/tp5/thi ...

  8. 【TP5.0】tp5.0实现连接多个数据库,实现类似3.2M(‘table’,'prefix_','db_config2')的CURD操作...

    1.db_connect的name链式操作,类似于3.2的M('table','prefix_','db_config2') /*** db_connect的name链式操作,类似于3.2的M('ta ...

  9. tp5 ajax 路由,tp5中ajax方式提交表单

    用ajax提交表单,迅速,快捷,实现页面无刷新提交表单. ajax批删 姓名 年龄 地址 添加 $("#sub").click(function(){ var name = $(& ...

最新文章

  1. SAP S/4 HANA中的供应链计划提升
  2. Linux入门-7 Linux管道、重定向以及文本处理
  3. php_标准类型-学习笔记
  4. cba篮球暂停次数和时间_中国篮球即将来袭!202021赛季CBA赛程时间表
  5. java 图形库_OpenGL开放图形java库jogamp-all-platforms.7z
  6. octave安装 缺java_Octave信号包安装
  7. CSHOP后台设置SMTP发邮件提示 Error: need RCPT command 错误解决
  8. 翼方健数邓振:“DRG+AI”助力实现医院精细化管理
  9. ExtJs2.0学习系列(11)--Ext.XTemplate
  10. Jlink-v8 灯不亮重新烧写固件的办法
  11. 阿里云服务器+ubantu+nodejs 服务器基本配置流程
  12. PHP 中检查是否关联数组(多维数组)的方法 (UPDATE!)
  13. mybatis教程4(动态SQL)
  14. 中国油页岩资源开发利用行业前景动态及未来发展趋势预测报告(2022-2027年)
  15. Unity 导航网格的使用
  16. 东鹏饮料,有点“上头”
  17. MySQL计算天数差
  18. Allegro模块镜像详细操作教程
  19. 91 个常见的 Laravel 面试题和答案
  20. SCSI 中定义的provision

热门文章

  1. SI战队人物专访-李斐菲
  2. 遥感影像镶嵌匀色及镶嵌线自动生成
  3. shopee运营技巧
  4. 医疗健康产品展-京东健康
  5. hexo加入留言功能
  6. Milo源码解析(五)
  7. fundebug 和 腾讯MTA
  8. 【校招VIP】校招投递上百份简历还是没回复,告诉你3个小技巧!
  9. D3S A Discriminative Single Shot Segmentation Trac,tracking by segm最后的希望,不同于tracking by siamese
  10. vue项目结构及启动文件加载过程分析