一、直接实例化视图类1、视图类:thinkphp/library/think/View.php;2、命名空间:usethink\View;3、实例化:动态newView();静态View::instance();4、常用方法:fetch()渲染模板,display()渲染内容,assign()模板赋值在index/controller/index.php中:<?phpnamespaceapp\index\controller;usethink\View;classIndex{publicfunctionindex(){//动态创建//$view=newView();//静态创建$view=View::instance();//模板赋值$view->assign('站三界导航','www.zhansanjie.com');//渲染模板return$view->fetch();}}?>在application\index\view\index\index.html中:<p>网站域名:<spanstyle="color:red">{$domain}</span></p><p>网站名称:<spanstyle="color:red">{$siteName}</span></p>二、继承控制器基类Controller1、控制器类:thinkphp/library/think/Controller.php;2、命名空间:usethink\Controller;3、实例化:$this->view;//可访问View类所有属性或方法4、常用方法:$this->fetch()渲染模板,$this->display()渲染内容,$this->assign()模板赋值,$this->engine()模板引擎在index.php中:<?phpnamespaceapp\index\controller;usethink\Controller;classIndexextendsController{publicfunctionindex(){//$this->view===>视图对象//$this->view->assign('siteName','站三界导航');//$this->view->assign('domain','www.zhansanjie.com');$this->assign('siteName','站三界导航');//用这种就可以,省事$this->assign('domain','www.zhansanjie.com');//用这种就可以,省事//渲染模板//return$this->view->fetch();return$this->fetch();//这样就行了}}?>三、助手函数view()1、不用继承Controller基类,不用实例化View类,都可以使用;2、仅适合于模板渲染,功能单一,不能加载配置;3、语法:view([模板文件],[模板变量数组],[模板替换数组]);4、使用方法实例:view('user',['name'=>'tp5'],['SITE'=>'php.cn']);所以,index.php文件夹中就变为了:<?phpnamespaceapp\index\controller;classIndex{publicfunctionindex(){returnview('index',['domain'=>'www.zhansanjie.com','siteName'=>'站三界导航']);}}?>总结:在控制器使用视图来调用模板,有三种方法:实例化视图类的规范模式,基类继承的经典模式,助手函数的快捷模式,新人推荐基类继承方式,但长远来看,实例化视图类应该是发展趋势,助手函数早晚会消失~~~
主要使用的php函数有:array_map(callback,array1,array…)array_map--为数组的每个元素应用回掉函数参数1:回掉函数,应用到每个数组里的每个元素参数2:数组,便利运行参数1设置的函数返回数组,包含回掉函数处理之后array1的所有元素。glob(pattern,flags)glob—寻找与模式匹配的文件路径参数1:必须。规定检索模式。参数2:可选。规定特殊的设定。这里就不过多介绍了因为这里用不到。想要实现效果的话可以直接复制以下代码:<?phpnamespaceapp\admin\controller;usethink\Cache;classCacheController{//清除缓存不删除cachepublicfunctionclearCache(){Cache::clear();$this->success("清除成功");}//清除模版缓存但不删除temp目录;publicfunctionclearTemp(){array_map('unlink',glob(TEMP_PATH.'*.php'));$this->success('清除成功');}//清除日志缓存并删出log空目录publicfunctionclearLog(){$path=glob(LOG_PATH.'*');foreach($pathas$val){array_map('unlink',glob($val.DS.'*.log'));rmdir($val);}$this->success('清除成功');}}以上就是Thinkphp5如何清除runtime下的cache、temp以及log缓存的详细内容,更多请关注站三界导航www.zhansanjie.com其它相关文章!
本文小编为大家详细介绍“thinkphp5中save方法如何用”,内容详细,步骤清晰,细节处理妥当,希望这篇“thinkphp5中save方法如何用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在thinkphp5中,save()方法用于向指定数据表中添加一条记录,该方法每次仅能向表中添加一条新记录,添加多条可重复执行,语法为“模型对象->save(数组)”或“模型对象->data(数组)->save();”。本文操作环境:Windows10系统、ThinkPHP5版、DellG3电脑。thinkphp5中save方法怎么用新增单条数据:save()方法功能:向指定数据表中添加一条记录该方法每次仅能向表中添加一条新记录,添加多条可重复执行,不过后面要学习的saveAll()可一次性添加多条save方法是Model类中较复杂的方法之一,因为save方法身兼多职,不仅用于新增,还可以用于更新数据。基本语法:格式1:将数据直接写在save方法参数中模型对象->save(数组);格式2:先生成数据对象,然后用save方法直接写入表中模型对象->data(数组)->save();这二种语法都可以完成新增操作。但是第二种语法结构更加清晰,可读性好,修改更加方便。<?phpnamespaceapp\index\controller;useapp\index\model\Staff;classIndex{publicfunctionindex(){//1.创建数据:与表中字段对应$data=[];$data['name']='站三界导航';$data['sex']=1;$data['age']=39;$data['salary']=3500;$data['dept']=3;$data['hiredate']=date('Y-m-d',time());//2.创建数据对象$model=(newStaff())->data($data);//3.获取新增操作执行前:数据对象原始数据$data_before=$model->getData();//4.查看新增操作执行前的数据对象:$modelecho'查看新增操作执行前的数据对象:<br/>';dump($data_before);//5.将数据对象原始数据写入数据表中,返回影响记录数//allowField(true)过滤post数组中的非数据表字段数据$affected=$model->allowField(true)->save();//6.获取新增操作执行后:数据对象原始数据$data_after=$model->getData();//7.查看新增操作执行后的数据对象:$modelecho'查看新增操作执行后的数据对象:<br/>';dump($data_after);//8.获取新增记录的主键id,等价于:$model->id$insert_ID=$affected?$data_after['id']:null;//6.验证是否新增成功echo$affected?'新增成功!新记录主键id是:'.$insert_ID:'新增失败!';}}save()方法classIndex{publicfunctionindex(){//1.创建数据:与表中字段对应$data=[];$data['name']='站三界导航';$data['sex']=1;$data['age']=39;$data['salary']=3500;$data['dept']=3;$data['hiredate']=date('Y-m-d',time());$model=newStaff();$affected=$model->allowField(true)->save($data);$data['name']='站三界导航';$data['sex']=1;$data['age']=39;$data['salary']=3000;$data['dept']=3;$data['hiredate']=date('Y-m-d',time());$affected=$model->allowField(true)->setAttr('id',null)//清空ID->isUpdate(false)//显式指定新增->save($data);读到这里,这篇“thinkphp5中save方法如何用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注站三界导航www.zhansanjie.com。
在index入口文件添加//处理跨域option预检请求if($_SERVER['REQUEST_METHOD']=='OPTIONS'){//允许的源原域名header('Access-Control-Allow-Origin:*');//允许的请求头信息header("Access-Control-Allow-Headers:Origin,X-requested-width,Content-type,Accept,Authorization");//允许的请求类型header("Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS,PATCH");exit;}获取header中的Authorization值publicfunctiongetToken(Request$request){$token=$request->header('Authorization');dump($token);}
用途:为了在程序上对某些验证接口上防止暴力破解,或者降低数据的压力可以使用这个简单的请求访问限制。注意事项:首先要TP5开启缓存,服务器要有Redis,或者用tp5默认的文件缓存也可以。/***接口请求限制*$time:一个完全相同的请求多长时间内不能重复请求*$limit:一段时间内不能重复访问相同接口的次数*@paramint$time*@paramint$limit*@returnbool*/functionrequestAccess($time=3,$limit=30){//获取访问用户的IP$ip=md5(request()->ip());//获取访问的接口路径$path=request()->path();//将IP和访问的接口路径md5加密成一个字符串,这样子就代表同一个客户访问的接口。$UV=md5($ip.$path);//每个IP和接口每分钟不能超过的次数$cacheIp=Cache::get($UV)?:0;if($cacheIp){if($cacheIp>$limit){returnfalse;}else{Cache::inc($UV,1);}}else{Cache::set($ip,1,60);}//将每个请求的IP地址、参数和路径拼接成同一个用户的一个完全相同的接口。$post=json_encode(request()->post());$name=md5($path.$post);//每个相同的数据多少时间内不能请求$cache=Cache::get($name);if($cache==$ip){returnfalse;}else{Cache::set($name,$ip,$time);returntrue;}}
tp5之layui分页样式1.分页类路径:\thinkphp\library\think\paginator\driverLayui.php<?phpnamespacethink\paginator\driver;usethink\Paginator;classLayuiextendsPaginator{/***上一页按钮*@paramstring$text*@returnstring*/protectedfunctiongetPreviousButton($text="上一页"){if($this->currentPage()<=1){return$this->getDisabledTextWrapper($text);}$url=$this->url($this->currentPage()-1);return$this->getPageLinkWrapper($url,$text);}/***下一页按钮*@paramstring$text*@returnstring*/protectedfunctiongetNextButton($text='下一页'){if(!$this->hasMore){return$this->getDisabledTextWrapper($text);}$url=$this->url($this->currentPage()+1);return$this->getPageLinkWrapper($url,$text);}/***页码按钮*@returnstring*/protectedfunctiongetLinks(){if($this->simple)return'';$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*@returnmixed*/publicfunctionrender(){if($this->hasPages()){if($this->simple){returnsprintf('<ulclass="pager">%s%s</ul>',$this->getPreviousButton(),$this->getNextButton());}else{returnsprintf('%s%s%s',$this->getPreviousButton(),$this->getLinks(),$this->getNextButton());}}}/***生成一个可点击的按钮**@paramstring$url*@paramint$page*@returnstring*/protectedfunctiongetAvailablePageWrapper($url,$page){return'<ahref="'.htmlentities($url).'">'.$page.'</a>';}/***生成一个禁用的按钮**@paramstring$text*@returnstring*/protectedfunctiongetDisabledTextWrapper($text){return'<aclass="layui-laypage-prev">'.$text.'</a>';}/***生成一个激活的按钮**@paramstring$text*@returnstring*/protectedfunctiongetActivePageWrapper($text){return'<spanclass="layui-laypage-curr"><emclass="layui-laypage-em"></em><em>'.$text.'</em></span>';}/***生成省略号按钮**@returnstring*/protectedfunctiongetDots(){return$this->getDisabledTextWrapper('...');}/***批量生成页码按钮.**@paramarray$urls*@returnstring*/protectedfunctiongetUrlLinks(array$urls){$html='';foreach($urlsas$page=>$url){$html.=$this->getPageLinkWrapper($url,$page);}return$html;}/***生成普通页码按钮**@paramstring$url*@paramint$page*@returnstring*/protectedfunctiongetPageLinkWrapper($url,$page){if($page==$this->currentPage()){return$this->getActivePageWrapper($page);}return$this->getAvailablePageWrapper($url,$page);}}2.配置文件paginate.php<?php/***@auther:xxf*Date:2019/9/2*Time:10:24*///分页配置return['type'=>'Layui','var_page'=>'page',];3.模型查询publicfunctiongetUserShowList($size=20,$where=null){$res=$this->field('id,title,list_order,is_top,create_time,create_timetime')->where($where)->order(['is_top'=>'desc','list_order'=>'desc','id'=>'desc'])->paginate($size);return$res;}4.模板渲染<divclass="layui-boxlayui-laypagelayui-laypage-molv">{$list|raw}</div>效果
1.修改样式文件进入项目根目录下的thinkphp文件夹下的library文件夹下的paginator,打开paginator文件夹中的dirver文件夹,看到有一个bootstrap.php文件,将该文件复制一份,重命名为Layui.php(可自定义,首字母大写,这里命名为Layui.php),并将Layui.php中的类名修改为Layui(classLayuiextendsPaginator)2.修改分页样式打开Layui.php文件,找到render方法(大致在109行,注释写着渲染分页),修改returnsprintf('你想要的样式',参数,参数(根据你%s的个数携带相同个数的参数,详情请百度phpsprintf函数)),一般来说只修改这里是不够的,你还需要修改getAvailablePageWrapper,getDisabledTextWrapper,getActivePageWrapper这三个方法,将他们的返回值改成你所需要的HTML代码.就可以了.最后会给出示例代码.3.修改配置文件进入项目跟目录下的application文件夹,在你存放后台文件的文件夹下创建config.php(例:application下的api文件是处理接口,admin文件夹是后台管理系统文件夹,config.php就是创建在admin文件夹下,也可以直接把application的config.php复制过来).创建好之后输入代码:<?phpreturn[//+站三界导航www.zhansanjie.com//|应用设置//+----------------------------------------------------------------------//分页配置'paginate'=>['type'=>'Layui',//这里改成你修改的样式文件'var_page'=>'page''list_rows'=>10,],];4.修改查询代码将你控制器里的select语句修改为paginate($this->_row(每页条数),false,$this->_param(参数)),view层展示页码的位置将原来的静态html代码替换成{$list(这里是用assgin传递过来的参数)->render()}时候刷新页面即可5.示例代码Layui.php部分代码:/***渲染分页html*@returnmixed*/publicfunctionrender(){if($this->hasPages()){if($this->simple){returnsprintf('<divclass="layui-card-body"><divclass="page"><div>%s%s</div></div></div>',$this->getPreviousButton(),$this->getNextButton());}else{returnsprintf('<divclass="layui-card-body"><divclass="page"><div>%s%s%s</div></div></div>',$this->getPreviousButton(),$this->getLinks(),$this->getNextButton());}}}/***生成一个可点击的按钮**@paramstring$url*@paramint$page*@returnstring*/protectedfunctiongetAvailablePageWrapper($url,$page){return'<aclass="num"href="'.htmlentities($url).'"style="margin:1px">'.$page.'</a>';}/***生成一个禁用的按钮**@paramstring$text*@returnstring*/protectedfunctiongetDisabledTextWrapper($text){return'<aclass="prev"href="javascript:void(0);">'.$text.'</a>';}/***生成一个激活的按钮**@paramstring$text*@returnstring*/protectedfunctiongetActivePageWrapper($text){return'<spanclass="currentnum"style="margin:2px">'.$text.'</span>';}控制器代码:publicfunctionlists(){$manager=newManagerModel();$lists=$manager->where($this->_map)->paginate($this->_row,false,$this->_param);//...无关代码$this->assign('lists',$lists);//这里传递参数return$this->fetch();//返回视图}视图层代码://...主体内容{$lists->render()}//分页原视图层代码//...主体内容//页码样式(替换成{$lists->render()})<divclass="layui-card-body"><divclass="page"><div><aclass="prev"href=""><<</a><aclass="num"href="">1</a><spanclass="current">2</span><aclass="num"href="">3</a><aclass="num"href="">489</a><aclass="next"href="">>></a></div></div></div>
<?phpnamespaceapp\index\controller;usethink\Request;//引入请求类classIndex{publicfunctionindex(Request$request){#获取浏览器输入框的值dump($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','onestopweb@163.com');//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());#获取URLdump($request->url());dump($request->baseUrl());}}地址栏输入的链接:http://192.168.0.180:55/index/index/index.html?name=chaoyi&type=blogstring(23)"http://192.168.0.180:55"string(22)"index/index/index.html"string(17)"index/index/index"string(3)"GET"bool(true)bool(false)bool(false)array(2){["name"]=>string(6)"chaoyi"["type"]=>string(4)"blog"}array(2){["name"]=>string(6)"chaoyi"["type"]=>string(4)"blog"}array(0){}array(1){["name"]=>string(10)"onestopweb"}array(3){["username"]=>string(6)"chaoyi"["PHPSESSID"]=>string(26)"nugcsr2j9krr2lhk8bntggl412"["email"]=>string(18)"onestopweb@163.com"}string(4)"blog"string(18)"onestopweb@163.com"string(5)"index"string(5)"Index"string(5)"index"string(45)"/index/index/index.html?name=chaoyi&type=blog"string(23)"/index/index/index.html"
首先知道最原始的分页如何实现。页面传进来一个p表示当前请求的页码,控制器接受到参数,组装到sql中,并且配置page的配置信息,例如,每页显示多少数据,然后利用sql先查出总个数,然后利用分页关系组装sql,查出来之后的得到对应的数据,接下来开始解析分页按钮等信息的渲染。经过漫长复杂的处理才可以完成一个分页的使用。TP分页类相当简单。其中将获取当前页码自动化获取,根据model自动组装sql,结合render渲染出需要的分页按钮。相当简单。具体说下,publicfunctiongetlist(){$cartoon_where=['block_sta'=>3,'is_on_show'=>1];$orderBy=['hot_num'=>'desc'];$hot_cartoons=Model('cartoon')->field('id,title,thumb,author,last_chapt,last_chapt_num,tags,serial_sta')->where($cartoon_where)->order($orderBy)->paginate(5,false,['var_page'=>'p']);return$hot_cartoons;}只需要在model中使用一个 ,配置url中表示页码的字符,这里用p,其实默认的是'page' .如果使用了page也可以任何东西都不用配置 paginate(5,false,['var_page'=>'p']);所有获取页码,组装sql,查询总数等都是类完成,但要注意调用的是model,而且返回的是一个bootstrap对象,但是这个data数据可以直接使用。简直不能更爽~例子详情参见:控制器:app\mobile\controller\rank->book_hot()和->ajax_ranking_info_book()注意:这个分页参数必须是get方式传递过来的。post的方式不支持 模板中常用{if($books->isEmpty())}//是否为空的判断{$books->currentPage()}//当前页码的获取{$books->lastPage()}//最后一页页码的获取
控制器中用foreach分别列出所有记录集//获取数据集$users=Db::name('user')->select();//直接操作第一个元素$item=$users[0];//获取数据集记录数$count=count($users);//遍历数据集foreach($usersas$user){echo$user['name'];echo$user['id'];}需要注意的是,如果要判断数据集是否为空,不能直接使用empty判断,而必须使用数据集对象的isEmpty方法判断,例如: $users=Db::name('user')->select();if($users->isEmpty()){echo'数据集为空';}