本文通过一个例子来描述从ThinkPHP3.2.3过渡到ThinkPHP5.0的学习笔记,分享给大家参考,如下:
很多项目都是用tp3.2.3做的,但毕竟要与时俱进,学习一些新的框架,比如tp5
下面记录了学习中遇到的一些问题和解决方法,以及tp3.2和tp5.0的一些区别,适合使用过tp3但从未使用过tp5的童鞋参考。
随着学习的不断更新,
总有一条分界线
首先,我从tp官网下载了最新的ThinkPHP5.0.22完整版:
直接扔到服务器上,解压后的目录结构如下:
整个目录结构类似于tp3.2,文件夹首字母缩写,应用入口文件在根目录public/index.php下,官方文档将公共文件夹定义为WEB部署目录(外部访问目录):
配置服务器域名解析时,您需要将项目的根目录指向/public:
virtual Host * :80 Server admin[email protected]document root/var/www/TP/Public Server name tp.oyhdo.com服务器别名tp.oyhdo.com目录索引index.php index.html index.htm/Virtual主机根目录应用程序/config.php是一个应用程序(公共)配置文件,设置一些常用的配置,以下简称“配置文件”:
访问以下网站:
访问tp.oyhdo.com相当于访问tp.oyhdo.com/index.php/index/Index/index(默认不区分大小写)
即默认模块索引、默认控制器索引和默认操作索引
配置文件的修改分别是default_module、default_controller和default_action
如果需要强制url区分大小写,请将url _ convert修改为false:
在配置文件中将app_debug设置为true,以打开应用程序调试模式进行开发和调试:
[在网址中隐藏index.php条目文件]
以Apache服务器为例,首先确认在Apache配置文件httpd.conf中打开了mod_rewrite.so模块:
然后将全部[AllowOverride]设置为全部:
最后,修改公共/的内容。根目录下的htaccess文件,如下所示:
IfModule mod _ rewrite . c Options follow symlinks-multivews Rewrite engine on Rewrite cond % { REQUEST _ FILENAME }!-d Rewrite cond % { REQUEST _ FILENAME }!^(.重写器*)$ index.php?/$1 [QSA,PT,L]/IfModule可以在没有索引的情况下访问
[隐藏前台网址模块名称]
索引模块用作前台,并在前台创建一个新的用户控制器:
?phpnamespace应用程序索引控制器;类User { public function User(){ return '这是用户控制器的用户操作';}}通常需要访问用户控制器的用户操作,如下所示:
为了在前台简洁地显示url,应该删除模块名称索引,然后它将折叠:
如果只有一个模块,可以在/application/common.php中添加:
//绑定当前访问的索引模块定义(' BIND_MODULE ',' index ');测试前访问成功:
但是,项目通常有正面和背面的区别。使用上述方法绑定索引模块后,至少有两个模块在访问其他模块时会报告错误:
(创建一个新的管理模块作为后台)
?phpnamespace app admin controller;类索引{public function index () {return '这是后一页';} }
如果是多个模块,您可以在/application/route.php中绑定默认模块路由(删除上面的单个模块绑定):
使用思考路线;Route:bind('索引');成功的前台访问:
然后在/public/下创建一个新的条目文件admin.php,并绑定后台模块admin来访问后台:
?PHP//[应用入口文件]命名空间think//定义应用程序目录定义(' app _ path ',_ _ dir _ _)。'/./application/');//加载框架启动文件需要_ _ dir _ _。'/./think PHP/base . PHP ';//将当前条目文件绑定到管理模块route : bind(' admin ');//关闭admin模块的route app : route(false);//执行应用app :3360 run()-send();后台访问成功:
(要修改后台地址,只需修改文件名即可。)
[返回数据]
配置文件中的默认输出类型default_return_type是html:
直接打印出字符串和数组,没什么特别的:
public function index(){ $ str=' hello,world!';$arr=array('state'=1,' msg '=' success ');//打印字符串echo $ str//打印数组var _ dump($ arr);}
返回json格式数据:
public function index(){ $ arr=array(' state '=1,' msg '=' success ');返回JSON($ arr);//返回其他状态码或响应头信息//返回JSON ($ arr,201,['cache-control'=' no-cache,必续']);//xml格式//返回XML($ arr);}
(仅限于API开发,可以将default_return_type设置为json,直接返回$arr返回json格式数据)
[渲染模板,分配数据]
视图层建立如图,index.html为前台首页(内容为“这是首页”):
Tp3渲染模板直接在控制器,$this-display()中,这是tp5不支持的。
Tp5渲染模板,继承控制器中的think Controller类,使用return $this-fetch()或使用helper函数return view():
?phpnamespace应用程序索引控制器;使用思考控制器;类Index扩展了Controller { public function Index(){ return $ this-fetch();//返回视图();} }
Tp5仍然使用$this-assign()来分配数据:
?phpnamespace应用程序索引控制器;使用思考控制器;类索引扩展了Controller { public function Index(){ $ name=' lws ';$this-assign('name ',$ name);返回$ this-fetch();}}index.html页面读取数据:
{ $ name }
(修改模板引擎标签配置文件[tpl_begin]和[tpl_end])
[继承父类控制器]
写一个栗子,创建一个新的基类控制器作为父类控制器,索引控制器继承基类控制器
初始化父类控制器中的分配数据,并通过子类控制器呈现模板:
Base.php:
?phpnamespace应用程序索引控制器;使用思考控制器;基类扩展了Controller{ //初始化方法publicfunction _ initialize () {$哈哈='下班了';$this-assign('哈哈',$哈哈);}}Index.php:
?phpnamespace应用程序索引控制器;使用思考控制器;类Index扩展了Base { public function Index(){ return $ this-fetch();}}index.html:
{ $哈哈}
(与tp3.2相比,父类控制器不能是公共控制器)
[配置参数]
Tp3.2使用c方法设置和获取配置参数
Tp5使用助手函数config()来设置和获取配置参数:
//配置参数配置(' name ',' lws ');//批量配置参数配置(['info'=['sex'=' nan ','艾蒿'=' NV ']);//获取配置参数echo config(' name ');//获取一组配置参数dump(config(' info '));//获取辅助配置参数echo config(' info . sex ');
[获取通行证参考]
Tp5取消了url/参数名1/参数值1/参数名2/参数值2的方式.还是你只是用了url?参数名称1=参数值1=参数名称2=参数值2.像这样传递。
在控制器中打印$_GET:
?phpnamespace应用程序索引控制器;使用思考控制器;类Index扩展了Controller { public function Index(){ $ getdate=$ _ GET;dump($ get date);}}这是错误的:
这样做很好:
[安全访问变量]
Tp3.2可以使用I方法获取系统输入变量,如get和post安全
tp5中使用了辅助函数输入()
//获取get变量$ data 1=input(' get . name ');//获取post变量$ data 2=input(' post . name ');//获取当前请求变量$ data 3=input(' param . name ');//获取请求变量$ data 4=input(' request . name ');//get cookie变量$ data 5=input(' cookie . name ');//获取会话变量$ data 6=input(' session . name ');//获取上传的文件信息$ data 7=input(' file . image ');(注意:获取的数据是数组,只能通过添加/a修饰符来获取)
$ arr=input(' post . arr/a ');您可以在配置文件中设置全局过滤方法:
//默认的全局筛选方法分隔多个“default _ filter”=“html specialchars”,[数据库操作]
tp5的数据库配置文件位于根目录/application/database.php:(也可以在模块下单独配置)
连接数据库:tp3.2支持M方法连接数据库,tp5使用db类或助手函数Db()
查询数据:仍然使用find()和select()方法,并使用value()而不是getField()查询字段
//查询a $ artin fo=db(' article ')-find();//查询所有$ artinfo=db(' article ')-select();//查询字段$ artin fo=db(' article ')-值(' article _ title ');添加数据:tp3.2使用Add(),tp5使用insert():返回插入次数或save():返回id
//添加一段数据$data['article_title']='PHP是世界上最好的语言';$data['article_content']='如topic ';db(' article ')-insert($ data);//或db(' article ')-save($ data);//添加多条数据$ data=[['article_title '=' title 1 ',' article_content'=' content 1'],['article_title'=' title 2 ',' article_content'=' content 2'],[' article _ title '。db(' article ')-insertAll($ data);修改数据:tp3.2使用保存(),tp5使用更新()
//当['article _ id']=1时,修改数据$ 1;$data['article_title']='修订标题';db(' article ')-where($ whe)-update($ data);删除数据:是或删除()
//当['article _ id']=1时,删除数据$ 1;db(' article ')-where($ whe)-delete();Db () assistant使用方便,但是每次都会重新连接数据库,所以要避免多次调用。建议使用Db类来操作数据库。
Db类运行本机SQL:
?phpnamespace应用程序索引控制器;使用think Db类索引{ public function index(){//insert record $ RES=db :3360 execute(' insert in lws _ article(title,content)值(' title ',' content ')));//删除数据$ RES=db:execute('从lws _ article中删除,其中art _ id=1 ');//更新记录$ RES=db : execute(' update lws _ article set title=' modify title '其中art _ id=1 ');//查询数据$ RES=db:query('从lws _ article中选择*其中art _ id=1 ');//显示数据库列表$ RES=db:Query('显示博客中的表');//清除数据表$ RES=db :3360 execute(' truncate table lws _ article ');}}Db类操作查询构造函数:
?phpnamespace应用程序索引控制器;使用think Db类索引{ public function index(){//查询数据(数据库没有配置表前缀)$ RES=db :3360 table(' lws _ article ')-其中(' art _ id ',1)-select();//为数据库配置了下表前缀。//插入记录$ RES=db:名称(' article ')-插入(['title'=' title ',' content '=' content ']);//更新记录$ RES=db : name(' article ')-其中(' art _ id ',1)-更新([' title '=' modify title ']);//查询数据$ RES=db : name(' article ')-其中(' art _ id ',1)-select();//delete data $ RES=db : name(' article ')-其中(' art _ id ',1)-delete();//链操作示例$ art list=db : name(' article ')-其中(' is _ del ',' n ')-字段(' id,title,content ')-顺序(' post _ time ',' desc ')-限制(10)}[切换数据库]
首先,在数据库配置中配置多个数据库:
//数据库配置1'db1'=[//数据库类型' type'='mysql ',//服务器地址' hostname'='127.0.0.1 ',//数据库名称' database'='blog1 ',//数据库用户名'='root ',//数据库密码' password'='123456 ',//数据库连接端口' hostport'=',//数据库连接参数' params'=[],//数据库编码默认采用utf8' charset'=' utf8 ',//数据库表前缀' prefix ' '//数据库配置2'db2'=[//数据库类型' type'='mysql ',//服务器地址' hostport'=' 127 . 0 . 0 . 1 ',//数据库名称' database'='blog2 ',//数据库用户名' username'='root ',//数据库密码' password'=',//数据库连接端口' host port '=',//数据库连接参数' params'=[],//数据库编码默认采用utf8' charset'=' utf8 ',//数据库表前缀' prefix'='lws_ '
?phpnamespace应用程序索引控制器;使用think Db类索引{ public function Index(){ $ db1=db : connect(' db1 ');$ DB2=db :3360 CONNECT(' DB2 ');$ db1-查询('从lws_article中选择*其中art _ id=1 ');$db2-query('从lws_article中选择*其中art _ id=2 ');} }[系统常数]
Tp5取消了很多常量:
所需常量如request _ method IS_GET IS_POST IS _ put IS _ delete IS _ Ajax _ ext _ common _ module _ name controller _ name action _ name app _ namespace app _ debug module _ path等可以自行定义,如IS _ GET和IS _ POST
我在父类的初始化方法中定义了这两个常数:
?phpnamespace应用程序索引控制器;使用思考控制器;基类扩展了Controller { public function _ initialize(){ define(' IS _ GET ',request()-isGet());定义(' IS_POST ',request()-isPost());}}然后可以用这个常量在子类控制器中做一些判断:
?phpnamespace应用程序索引控制器;class Index扩展了Base { public function Index(){ if(IS _ POST){ echo 111;} else { echo 222} } }[定义路由]
比如一个博客详情页,原来的URL是:http://oyhdo.com/home/article/detial? Id=50,也就是home模块下文章控制器下的detial操作方法,传递参数Id。
在路由配置文件application/route.php中添加路由规则:
return[' article/: id '=' home/article/detial ',];或者使用Route类,效果是一样的:
使用思考路线;route : rule(' article/: id ',' home/article/detial ');定义路由规则后,您可以访问http://oyhdo.com/article/50
[修改url分隔符]
在应用程序/config.php中修改pathinfo_depr:
//pathinfo分隔符' pathinfo_depr'='-',访问网址变为:http://oyhdo.com/article-50
[跳转,重定向]
tp3中的正确跳转:$this-success()、错误跳转:$this-error()和重定向:$this-redirect()也适用于tp5(继承自thinkController)
Tp5为重定向添加了redirect()助手函数:
return redirect(' https://www . oyh do.com ');更多对thinkPHP感兴趣的读者可以查看本网站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》、《PHP模板技术总结》、0103010。
希望本文对基于ThinkPHP框架的PHP编程有所帮助。