万变不离其宗,tp5和tp3.2虽说是差别很大,但是套路大家都懂得。只要我们了解了他们的区别,再去学tp5,岂不是如鱼得水。
好,那我们来了解一下tp5和tp3.2的区别。
我们都知道thinkphp是一个单入口框架,它所有的请求都通过public/index.php进入,如果我们正常情况下,我们默认访问的是index模块下的Index控制器下的index方法,如果我们现在想访问index.php或者是我们在这个地方再新建一个其它的文件,我们能不能将这个文件,直接绑定到某个模块?
我们在入口文件(public/index.php)中添加如下代码(注意顺序一定是这样的),他就会通过index.php,自动访问home模块
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 绑定到index模块
define('BIND_MODULE','home');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
如果我的网站开发给第三方,那么我肯定不期望第三方访问我的index模块和admin模块,这样我们只需要在index.php入口文件的同级建一个api.php,然后在api.php中绑定api模块,这样我们访问public/api.php直接访问api模块,别的模块访问不了。
此外,在thinkphp/convention.php中有一个 ‘auto_bind_module’,我们把它改成true,开启了入口文件自动绑定,也可以实现同样的操作
thinkphp/convention.php找到url_route_on和url_route_must,是配置路由是否开启和是否强制使用路由。
我们使用默认配置,然后找到public/route.php文件
return [
'test/:id' => 'index/test'
];
配置好路由,就可以通过指定路由访问。
5.0新增了请求对象Request和响应对象Response,Request统一处理请求和获取请求信息,Response对象负责输出客户端或者浏览器响应。
tp5中我们有三种方法可以让我们获得Request对象
1,框架提供的一个助手函数request()
2,是通过think下的Request类来获取它的实例
3,直接注入Request对象
具体获取参数方法如下:
domain());
dump($request->pathinfo());
dump($request->path());
# 请求类型
dump($request->method());
dump($request->isGet());
dump($request->isPost());
dump($request->isAjax());
# 请求的参数
dump($request->get());
dump($request->param());
dump($request->post());
//session('name', 'onestopweb');
//cookie('email', '[email protected]');
//session(null);
//cookie('email',null);
dump($request->session());
dump($request->cookie());
dump($request->param('type'));
dump($request->cookie('email'));
# 获取模块 控制器 操作
dump($request->module());
dump($request->controller());
dump($request->action());
# 获取URL
dump($request->url());
dump($request->baseUrl());
}
}
tp5.0
助手函数废除了单字母函数,改用助手函数
M->db
调用数据表:
M('User')->where(['name'=>'thinkphp'])->find();(3.2)
db('User')->where('name'=>'thinkphp')->find();(5.0)
D->model
实例化模型的使用:
D('User')->where(['name'=>'thinkphp'])->find();
model('User')->where(['name'=>'thinkphp'])->find();
//或者
$UserModel =new User();
$UserModel->where(['name'=>'thinkphp'])->find();
U->url
IS_Get->Request::instance()->isGet();
IS_POST->Request::instance()->isPost();
I->input(代替)
如果你继承think\Controller
的话,可以使用:
return $this->fetch('index/hello');
如果你的控制器没有继承 think\Controller
的话,使用:
return view('index/hello');
5.0版本废弃了原来的大部分常量定义,仅仅保留了框架的路径常量定义,其余的常量可以使用App类或者Request类的相关属性或者方法来完成,或者自己重新定义需要的常量。
废除的常量包括:
REQUEST_METHOD、IS_GET IS_POST、IS_PUT、IS_DELETE、IS_AJAX __EXT__、COMMON_MODULE 、MODULE_NAME、CONTROLLER_NAME、ACTION_NAME、APP_NAMESPACE、APP_DEBUG、MODULE_PATH
当然一些常用的常量可以自己定义,如定义路径常量
在application/config.php,或者在模块下新建一个config.php。
return [
'view_replace_str' =>[
'__HOME__' => '/static/home',
]
];
我们还是可以方便的引入和替换一些css,js 文件
模板继承是一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层。模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。
因此,模板继承的优势其实是设计基础模板中的区块(block)和子模板中替换这些区块。
每个区块由{block} {/block}
标签组成。 下面就是基础模板中的一个典型的区块设计(用于设计网站标题):
{block name="title"}网站标题 {/block}
block标签必须指定name属性来标识当前区块的名称,这个标识在当前模板中应该是唯一的,block标签中可以包含任何模板内容,包括其他标签和变量,例如:
{block name="title"}{$web_title} {/block}
你甚至还可以在区块中加载外部文件:
{block name="include"}{include file="Public:header" /}{/block}
一个模板中可以定义任意多个名称标识不重复的区块,例如下面定义了一个base.html
基础模板:
{block name="title"}标题{/block}
{block name="menu"}菜单{/block}
{block name="left"}左边分栏{/block}
{block name="main"}主内容{/block}
{block name="right"}右边分栏{/block}
{block name="footer"}底部{/block}
然后我们在子模板(其实是当前操作的入口模板)中使用继承:
{extend name="base" /}
{block name="title"}{$title}{/block}
{block name="menu"}
首页
资讯
论坛
{/block}
{block name="left"}{/block}
{block name="main"}
{volist name="list" id="vo"}
{$vo.title}
{$vo.content}
{/volist}
{/block}
{block name="right"}
最新资讯:
{volist name="news" id="new"}
{$new.title}
{/volist}
{/block}
{block name="footer"}
{__block__}
@ThinkPHP 版权所有
{/block}
上例中,我们可以看到在子模板中使用了extend标签来继承了base模板
tp5.0标签默认使用{ },3.2是< >,变量输出使用普通标签就足够了,但是要完成其他的控制、循环和判断功能,就需要借助模板引擎的标签库功能了,系统内置标签库的所有标签无需引入标签库即可直接使用。
内置标签包括:
标签名 | 作用 | 包含属性 |
---|---|---|
include | 包含外部模板文件(闭合) | file |
load | 导入资源文件(闭合 包括js css import别名) | file,href,type,value,basepath |
volist | 循环数组数据输出 | name,id,offset,length,key,mod |
foreach | 数组或对象遍历输出 | name,item,key |
for | For循环数据输出 | name,from,to,before,step |
switch | 分支判断输出 | name |
case | 分支判断输出(必须和switch配套使用) | value,break |
default | 默认情况输出(闭合 必须和switch配套使用) | 无 |
compare | 比较输出(包括eq neq lt gt egt elt heq nheq等别名) | name,value,type |
range | 范围判断输出(包括in notin between notbetween别名) | name,value,type |
present | 判断是否赋值 | name |
notpresent | 判断是否尚未赋值 | name |
empty | 判断数据是否为空 | name |
notempty | 判断数据是否不为空 | name |
defined | 判断常量是否定义 | name |
notdefined | 判断常量是否未定义 | name |
define | 常量定义(闭合) | name,value |
assign | 变量赋值(闭合) | name,value |
if | 条件判断输出 | condition |
elseif | 条件判断输出(闭合 必须和if标签配套使用) | condition |
else | 条件不成立输出(闭合 可用于其他标签) | 无 |
php | 使用php代码 | 无 |