ThinkPHP5.1教程36.路由的变量规则和闭包
thinkphp5学习总结5---超全局变量,魔术方法和魔术变量大全

thinkphp5学习总结5---超全局变量,魔术⽅法和魔术变量⼤全PHP中的这三种变量PHP在设计的时候已经预定义了9个超级全局变量、8个魔术变量和13魔术函数,这些变量和函数可以在脚本的任何地⽅不⽤声明就可以使⽤。
在PHP开发会频繁的使⽤这些变量和函数,这些变量和函数可以⽅便的帮我们解决很多问题。
下⾯详细的讲解下PHP中的超级全局变量、魔术变量和魔术函数。
1.超全局变量(9个)$GLOBALS 储存全局作⽤域中的变量 $_SERVER 获取服务器相关信息 $_REQUEST 获取POST和GET请求的参数 $_POST 获取表单的POST请求参数 $_GET 获取表单的GET请求参数 $_FILES 获取上传⽂件的的变量 $_ENV 获取服务器端环境变量的数组 $_COOKIE 浏览器cookie的操作 设置cookie:setcookie(name, value, expire, path, domain); 获取cookie:$_COOKIE["user"]; 删除cookie:setcookie("user", "", time()-3600);//设置过期时间 $_SESSION 服务端session的操作 使⽤session前⼀定要session_start()启动session 储存session:$_SESSION["name"]="King";//数组操作 销毁session:unset($_SESSION["name"]);//销毁⼀个 session_destroy()和unset($_SESSION);//销毁所有的session2.魔术⽅法(8个) __LINE__ ⽂件中的当前⾏号。
__FILE__ ⽂件的完整路径和⽂件名。
如果⽤在被包含⽂件中,则返回被包含的⽂件名。
ThinkPHP5.1教程37.路由的地址和缓存

37.路由的地址和缓存学习要点:1.路由地址2.路由缓存本节课我们来学习一下路由的地址和参数功能。
一.路由地址1.路由的地址一般为:控制器/方法,如果多模块则:模块/控制器/方法;//默认Index控制器Route::get('/','index');//控制器/方法Route::get('details/:id','Address/details');//模块/控制器/方法Route::get('details/:id','index/Address/details');2.支持多级控制器,并且支持路由到相应的地址;//目录为:application\controller\groupnamespace app\controller\group;//地址为:application\controller\grouphttp://localhost:8000/group.address/details/id/5//支持多级路由Route::get('details/:id','group.Address/details');3.支持动态路由地址以及额外参数地址;Route::get('details-:name-:id','Hello_:name/details');//获取隐式GET值:$this->request->param('flag');Route::get('details/:id','Address/details?flag=1&status=1');4.支持直接去执行方法,不单单是普通方法,还有静态方法;Route::get('details/:id','app\controller\Address@details');Route::get('stat/:id','app\controller\Address::stat');5.路由也支持重定向功能,实现一个外部跳转;Route::get('details/:id','/details/:id')->status(302);Route::redirect('details/:id','/details/:id',302);6.路由也可以对模版进行传值;Route::view('see/:name','See/other');Route::view('see/:name','See/other',['email'=>'huiye@']);二.路由缓存1.路由缓存可以极大的提高性能,需要在部署环境下才有效果,在app.php开启;'route_check_cache'=>true,2.为了测试路由缓存是否真的在起作用,可以通过一条命令行命令来清理缓存测试;>php think clear--route。
ThinkPHP5.1教程38.路由的参数和快捷路由

学习要点: 1.路由参数 2.快捷路由
本节课我们来学习一下路由的参数和快捷路由的方式。
一.路由参数
1. 设置路由的时候,可以设置第三个数组参数,主要实施匹配检测和行为执行; 2. ext 参数作用是检测 URL 后缀,比如:我们强制所有 URL 后缀为.html;
Route::get('details/:id', 'address/details', ['ext'=>'html']);
//设置 false 为禁止后缀,空允许所有后缀
'url_html_suffix'
=> 'html',
6. denyExt 参数作用是禁止某些后缀的使用;
Route::get('details/:id', 'address/details')->denyExt('gif|jpg|png');
7. filter 参数作用是对额外参数进行检测;
Route::get('details/:id', 'address/details', ['ext'=>'html', 'https'=>true]); Route::get('details/:id', 'address/details')->ext('html')->https();
5. 如果想让全局统一配置 URL 后缀的话,可以在 app.php 中设置;
Route::get('details/:id', 'address/details')->filter('id', 10);
超好用的thinkphp5.0thinkphp5.1分页插件!详细使用步骤(内附代码)

超好⽤的thinkphp5.0thinkphp5.1分页插件!详细使⽤步骤(内附代码)效果tp5.0使⽤⽅法page下载地址: 提取码:s75k1,把page⽂件夹整个⽬录复制到⽬录extend下2,修改默认配置 app/config.php把⾥⾯的'paginate' => ['type' => 'page\Page',//修改这个原始为bootstrap'var_page' => 'page','list_rows' => 5,],3,控制器中 ,参考⼀下$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$delList=Db::table('staff')->where($where)->order('id asc')->paginate(4,false,['query'=>$request->param()]);4,视图中{$delList->render()}tp5.1使⽤⽅法1,把page⽂件夹整个⽬录复制到⽬录extend下2,控制器中的⽅法public function index(Request $request){$name=$request->param('name');//接受参数⼀定要⽤param接收可以接收post和get$where=[['status','eq',1]];if (!empty($name)){$where[]=['name','like',"%$name%"];}$list=Db::table('staff')->where($where)->order('id asc')->paginate(12,false,['query'=>$request->param(),'type' => 'page\Page','var_page' => 'page']); $page=$list->render();//paginate第⼀个参数为每页显⽰的条数//paginate第⼆个参数为简单模式或总数//paginate第三个参数为分页的条件也可以写数组//总条数$allData=Db::table('staff')->where('status',1)->count();$this->assign('list',$list);$this->assign('page',$page);$this->assign('count',$allData);return $this->fetch('staff-list');}3,视图中,⼀定要写raw,具体含义看⽂档{$page|raw}Page.php 如下图<?phpnamespace page;// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2017 All rights reserved.// +----------------------------------------------------------------------// | Licensed ( /licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: zhangyajun <448901948@>// +----------------------------------------------------------------------use think\Paginator;class Page extends Paginator{//⾸页protected function home() {if ($this->currentPage() > 1) {return "<a href='" . $this->url(1) . "' title='⾸页'>⾸页</a>";} else {return "<p>⾸页</p>";}}//上⼀页protected function prev() {if ($this->currentPage() > 1) {return "<a href='" . $this->url($this->currentPage - 1) . "' title='上⼀页'>上⼀页</a>";} else {return "<p>上⼀页</p>";}}//下⼀页protected function next() {if ($this->hasMore) {return "<a href='" . $this->url($this->currentPage + 1) . "' title='下⼀页'>下⼀页</a>";} else {return"<p>下⼀页</p>";}}//尾页protected function last() {if ($this->hasMore) {return "<a href='" . $this->url($this->lastPage) . "' title='尾页'>尾页</a>";} else {return "<p>尾页</p>";}}//统计信息protected function info(){return "<p class='pageRemark'>共<b>" . $this->lastPage ."</b>页 <b>" . $this->total . "</b>条数据</p>";}/*** 页码按钮* @return string*/protected function getLinks(){$block = ['first' => null,'slider' => null,'last' => null];$side = 3;$window = $side * 2;if ($this->lastPage < $window + 6) {$block['first'] = $this->getUrlRange(1, $this->lastPage);} elseif ($this->currentPage <= $window) {$block['first'] = $this->getUrlRange(1, $window + 2);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);} elseif ($this->currentPage > ($this->lastPage - $window)) {$block['first'] = $this->getUrlRange(1, 2);$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);} else {$block['first'] = $this->getUrlRange(1, 2);$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);}$html = '';if (is_array($block['first'])) {$html .= $this->getUrlLinks($block['first']);}if (is_array($block['slider'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['slider']);}if (is_array($block['last'])) {$html .= $this->getDots();$html .= $this->getUrlLinks($block['last']);}return$html;}/*** 渲染分页html* @return mixed*/public function render(){if ($this->hasPages()) {if ($this->simple) {return sprintf('%s<div class="pagination">%s %s %s</div>',$this->css(),$this->prev(),$this->getLinks(),$this->next());} else {return sprintf('%s<div class="pagination">%s %s %s %s %s %s</div>',$this->css(),$this->home(),$this->prev(),$this->getLinks(),$this->next(),$this->last(),$this->info());}}}/*** ⽣成⼀个可点击的按钮** @param string $url* @param int $page* @return string*/protected function getAvailablePageWrapper($url, $page){return '<a href="' . htmlentities($url) . '" title="第"'. $page .'"页" >' . $page . '</a>';}/*** ⽣成⼀个禁⽤的按钮** @param string $text* @return string*/protected function getDisabledTextWrapper($text){return '<p class="pageEllipsis">' . $text . '</p>';}/*** ⽣成⼀个激活的按钮** @param string $text* @return string*/protected function getActivePageWrapper($text){return '<a href="" class="cur">' . $text . '</a>';}/*** ⽣成省略号按钮** @return string*/protected function getDots(){return$this->getDisabledTextWrapper('...');}/*** 批量⽣成页码按钮.** @param array $urls* @return string*/protected function getUrlLinks(array$urls){$html = '';foreach ($urls as$page => $url) {$html .= $this->getPageLinkWrapper($url, $page); }return$html;}/*** ⽣成普通页码按钮** @param string $url* @param int $page* @return string*/protected function getPageLinkWrapper($url, $page){if ($page == $this->currentPage()) {return$this->getActivePageWrapper($page);}return$this->getAvailablePageWrapper($url, $page); }/*** 分页样式*/protected function css(){return ' <style type="text/css">.pagination p{margin:0;cursor:pointer}.pagination{height:40px;padding:20px 0px;}.pagination a{display:block;float:left;margin-right:10px;padding:2px 12px;height:24px;border:1px #cccccc solid;background:#fff;text-decoration:none;color:#808080;font-size:12px;line-height:24px;}.pagination a:hover{color:#077ee3;background: white;border:1px #077ee3 solid;}.pagination a.cur{border:none;background:#077ee3;color:#fff;}.pagination p{float:left;padding:2px 12px;font-size:12px;height:24px;line-height:24px;color:#bbb;border:1px #ccc solid;background:#fcfcfc;margin-right:8px;}.pagination p.pageRemark{border-style:none;background:none;margin-right:0px;padding:4px 0px;color:#666;}.pagination p.pageRemark b{color:red;}.pagination p.pageEllipsis{border-style:none;background:none;padding:4px 0px;color:#808080;}.dates li {font-size: 14px;margin:20px 0}.dates li span{float:right}</style>';}}-----------------------------------------------------------------------优化如下:。
ThinkPHP5.1教程40.路由的MISS和跨域请求

ThinkPHP5.1教程40.路由的MISS和跨域请求40.路由的MISS和跨域请求学习要点:1.MISS路由2.跨域请求本节课我们来学习一下路由的MISS功能和跨域请求的问题。
一.MISS路由1.全局MISS,类似开启强制路由功能,匹配不到相应规则时自动跳转到MISS;Route::miss('public/miss');2.分组MISS,可以在分组中使用miss方法,当不满足匹配规则时跳转到这里;Route::miss('miss');二.跨域请求1.当不同域名进行跨域请求的时候,由于浏览器的安全限制,会被拦截;2.所以,为了解除这个限制,我们通过路由allowCrossDomain()来实现;Route::get('col/:id','Collect/read')->ext('html')->allowCrossDomain();3.实现跨域比如没有实现的header头文件多了几条开头为Access 的信息;4.此时,这个页面,就可以支持跨域请求的操纵了;5.我们创建一个不同端口号或不同域名的ajax按钮,点击获取这个路由页面信息;6.如果,没有开启跨域请求,则会爆出提醒:已拦截跨源请求:同源策略禁止读取位于http://localhost:8000/col/5.html的远程资源。
(原因:CORS头缺少'Access-Control-Allow-Origin')7.开启后,即正常获取得到的数据;8.如果你想限制跨域请求的域名,则可以增加一条参数;Route::get('col/:id','Collect/read')->ext('html')->header('Access-Control-Allow-Origin','http://localhost') ->allowCrossDomain();。
thinkphp5.1 haswhere 用法

thinkphp5.1 haswhere 用法在ThinkPHP 5.1 中,`hasWhere` 是Query 构建器中的一个方法,用于检查是否存在符合特定条件(即where 条件)的记录。
如果找到至少一条符合条件的数据,则返回`true`,否则返回`false`。
这个方法通常用于进行条件判断,以避免执行复杂的查询。
下面是`hasWhere` 方法的基本用法:```php// 假设$model 是一个模型实例$model = new YourModel();// 检查是否存在符合条件$condition 的记录if ($model->hasWhere($condition)) {// 存在符合条件的记录} else {// 不存在符合条件的记录}```其中,`$condition` 是一个闭包,用于指定查询条件。
例如:```php// 检查是否存在id 为1 的记录if ($model->hasWhere('id = 1')) {// 存在id 为1 的记录} else {// 不存在id 为1 的记录}```你也可以使用更复杂的条件:```php// 检查是否存在name 为'John' 并且age 大于18 的记录if ($model->hasWhere(['name' => 'John', 'age' => '> 18'])) {// 存在符合条件的记录} else {// 不存在符合条件的记录}````hasWhere` 方法是Query 构建器提供的一个简洁的方式,用于在执行数据操作之前快速检查是否存在特定的数据。
这可以避免不必要的数据库查询,从而提高应用的性能。
thinkphp 路由跳转 默认方法
thinkphp 路由跳转默认方法在thinkphp框架中,默认情况下,当访问一个控制器的时候,它会默认执行该控制器下的index方法。
然而,有时候我们希望能够更改默认执行的方法,这就需要进行路由跳转操作。
在thinkphp框架中,可以通过配置文件或者注解的方式来设置默认执行的方法。
配置文件方式:1. 打开项目根目录下的config目录,找到route.php文件。
2. 在该文件中,可以看到`'url_route_on' => true`,确保该配置项为true,启用路由功能。
3. 在路由定义中,可以看到以下示例代码:```phpuse think\facade\Route;Route::rule('hello/:name', 'index/index/hello')->ext('html')->method('GET');```4. 在对应的路由定义中,将目标方法修改为你所需要的默认方法即可。
例如,将`'index/index/hello'`修改为`'index/index/myDefaultMethod'`,这样当访问该控制器时,默认执行的方法就会变为myDefaultMethod。
注解方式:1. 在对应控制器的注释块中,添加`@route`注解。
2. 在注解中,指定路由规则,可以设置默认执行的方法。
例如:```php/*** 控制器注释...* @route('index/myDefaultMethod')*/public function index(){// ...}```这样当访问该控制器时,默认执行的方法就会变为myDefaultMethod。
通过以上方式,可以非常灵活地进行thinkphp框架中默认方法的路由跳转设置。
请注意,修改配置文件或者注解时务必遵循thinkphp框架的语法规则,以确保功能正常运作。
thinkphp 路由注解原理
thinkphp 路由注解原理ThinkPHP是一个基于PHP的开源框架,它提供了许多便捷的功能和工具,其中之一就是路由注解。
路由注解可以帮助开发者将请求映射到特定的控制器和方法,提高代码的可读性和维护性。
下面将详细解释ThinkPHP路由注解的原理。
一、路由在Web开发中,路由是指根据URL地址的不同,将请求映射到不同的处理方法上。
传统的路由通常是通过配置文件来实现的,但配置文件对于大型项目来说可能会变得冗长且难以维护。
因此,ThinkPHP 引入了路由注解的概念,使开发者可以在控制器类的注解中定义路由规则。
二、注解注解是一种用于为代码添加元数据的特殊语法。
在PHP中,注解是通过DocComment(文档注释)来实现的。
注解通常以@开头,并且可以通过反射机制来获取和解析。
在ThinkPHP中,通过解析注解来实现路由的映射。
三、路由注解在ThinkPHP中,可以使用`@route`注解来定义路由规则。
在一个控制器类中加入`@route`注解,可以为该类的所有请求方法定义一个公共路由规则。
同时,也可以在具体的方法上使用`@route`注解,为该方法定义一个独立的路由规则。
注解的具体用法如下:1.路由模式ThinkPHP支持三种不同的路由模式:-普通模式:类似于传统的控制器/方法/参数的方式。
- RESTful模式:可以定义对应HTTP请求方法的路由规则,比如GET、POST、PUT等。
-插件模式:可以定义一些插件路由规则,用于扩展特定的功能。
2.注解参数`@route`注解支持以下参数:- pattern:路由规则,支持正则表达式。
- method:请求方法,支持GET、POST、PUT等。
- ext:路由后缀。
- name:路由别名。
- filter:过滤器。
四、路由解析在ThinkPHP框架中,路由解析是在请求进入框架之前进行的。
框架会解析URL地址,并根据注解配置的路由规则进行匹配。
如果匹配成功,框架会调用对应的控制器和方法来处理请求。
ThinkPHP5.1教程42.资源路由
//批量 Route::rest([
'save' => ['POST', '', 'store'], 'update' => ['PUT', '/:id', 'save'], 'delete' => ['DELETE', '/:id', 'destory'], ]);
19. 使用嵌套资源路由,可以让上级资源对下级资源进行操作,创建 Comment 资源; class Comment { public function read($id, $blog_id) { return 'Comment id:'.$id.',Blog id:'.$blog_id; } public function edit($id, $blog_id) { return 'Comment id:'.$id.',Blog id:'.$blog_id; } }
3. 模块/控制器,默认在 controller 目录下,根据你的情况调整路径结构;
php think make:controller Blog
//单应用
php think make:controller ../index/controller/Blog //多应用
thinkphp6 路由规则
thinkphp6 路由规则ThinkPHP6是一款基于PHP的开源框架,具有灵活、高效、安全等特点。
其中,路由规则是ThinkPHP6的一个重要功能,它用于定义URL与控制器方法之间的映射关系,实现请求的分发和处理。
本文将围绕ThinkPHP6的路由规则展开,详细介绍其使用方法与注意事项。
一、基本概念在ThinkPHP6中,路由规则是通过在路由定义文件(route/route.php)中进行配置的。
路由规则由请求方法、请求路径、控制器方法和中间件等元素组成,用于将不同的请求映射到对应的控制器方法上。
二、路由定义1.基本路由基本路由是最简单的一种路由规则,它将请求路径直接映射到指定的控制器方法上。
例如,我们可以将"/index"映射到Index控制器的index方法:```phpRoute::get('/index', 'index/index');```这样,当用户访问"/index"时,系统会自动调用Index控制器的index方法来处理请求。
2.带参数路由有时候,我们需要在请求路径中传递参数,例如"/user/1"表示获取id为1的用户信息。
在ThinkPHP6中,可以通过使用占位符来实现参数传递。
例如:```phpRoute::get('/user/:id', 'user/info');```这样,当用户访问"/user/1"时,系统会自动将1传递给user控制器的info方法作为参数。
3.多请求方法路由在路由规则中,可以指定多个请求方法来映射同一个控制器方法。
例如,以下代码将同时将GET和POST请求映射到Index控制器的index方法上:```phpRoute::rule('/index', 'index/index')->method('GET|POST');```这样,无论用户使用GET还是POST请求访问"/index",系统都会调用Index控制器的index方法来处理请求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
36.路由的变量规则和闭包
学习要点:
1.变量规则
2.闭包支持
本节课我们来学习一下路由的变量规则和闭包支持的功能。
一.变量规则
1.系统默认的路由变量规则为\w+,即字母、数字和下划线;
2.如果我们需要对于具体的变量进行单独的规则设置,则需要通过pattern()方法;
3.将details方法里的id传值,严格限制必须只能是数字\d+;
Route::get('details/:id','address/details')
->name('det')
->pattern('id','\d+');
4.也可以设置search方法的两个值的规则,通过数组的方式传递参数;
Route::get('search/:id/:uid','address/search')
->pattern([
'id'=>'\d+',
'uid'=>'\d+'
]);
5.以上两种,均为局部变量规则,也可以直接在Route.php设置全局变量规则;
Route::pattern([
'id'=>'\d+',
'uid'=>'\d+'
]);
6.也支持使用组合变量规则方式,实现路由规则;
Route::get('details-
->pattern('id','\d+');
7.动态组合的拼装,地址和参数如果都是模糊动态的,可以使用如下方法;
Route::get('details-:name-:id','Hello_:name/details')
->pattern('id','\d+');
8.在不设定任何规则的情况下,系统默认为\w+,在配置文件中可以更改默认规则;
'default_route_pattern'=>'[\w\-]+',
二.闭包支持
1.闭包支持我们可以通过URL直接执行,而不需要通过控制器和方法;
Route::get('think',function(){
return'hello,ThinkPHP5!';
});
2.闭包支持也可以传递参数和动态规则;
Route::get('hello/:name',function($name){
return'Hello,'.$name;
});