从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解 本文实例讲述了从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记。分享给大家供大家参考,具体如下: 用tp3.2.3做了不少项目,但是毕竟要与时代接轨,学习一些新的框架,比如tp5 以下记录一些学习中遇到的问题及解决办法,还有tp3.2和tp5.0的一些区别,适合给用过tp3没用过tp5的童鞋做个参考。 随着学习不断更新...... +++++++++++++++++++++++分割线总是要有的+++++++++++++++++++++++ 首先到tp官网下载了一个最新的ThinkPHP5.0.22完整版: 直接扔到了服务器上,解压后目录结构如下: 目录结构整体与tp3.2大同小异,文件夹首字母小写了,应用入口文件 在根目录下 public/index.php,官方文档对public文件夹定义为WEB部署目录(对外访问目录): 配置服务器域名解析的时候需要把项目根目录指向/public: ServerAdmin 1977629361@qq.com DocumentRoot /var/www/tp/public ServerName tp.oyhdo.com ServerAlias tp.oyhdo.com DirectoryIndex index.php index.html index.htm 根目录下 application/config.php 为应用(公共)配置文件,设置一些常用的配置,以下简称为“配置文件”: 访问网址如下: 访问tp.oyhdo.com等同于访问tp.oyhdo.com/index.php/index/Index/index(默认不区分大小写) 即默认模块index,默认控制器Index,默认操作index 配置文件修改分别为default_module、default_controller、default_action 如果需要强制区分url大小写,修改 url_convert 为false: 配置文件中设置 app_debug 为true,打开应用调试模式,以便开发调试: 【隐藏url中的index.php入口文件】 以Apache服务器为例,首先确认Apache配置文件httpd.conf中开启了mod_rewrite.so模块: 然后把所有【AllowOverride】设为All: 最后修改根目录下 public/.htaccess 文件内容为: Options +FollowSymlinks -Multiviews RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] 去掉index.php也可访问: 【隐藏前台url模块名】 把index模块作为前台,在前台新建了一个User控制器: 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'); return json($arr); //返回其它状态码或响应头信息 //return json($arr, 201, ['Cache-control' => 'no-cache,must-revalidate']); //xml格式 //return xml($arr); } (对于只做API开发的情况,可以设置default_return_type为json,直接return $arr即可返回json格式数据) 【渲染模板、分配数据】 如图建立视图层,index.html作为前台首页(内容为“这是首页”): tp3渲染模板直接在控制器里$this->display(),tp5并不支持。 tp5渲染模板,在控制器中继承think\Controller类,使用 return $this->fetch() 或者使用助手函数 return view(): fetch(); //return view(); } } tp5分配数据的方式依旧使用 $this->assign(): assign('name',$name); return $this->fetch(); } } index.html页面读取数据: {$name} (修改模板引擎标签 配置文件【tpl_begin】、【tpl_end】) 【继承父类控制器】 写一个栗子,新建一个Base控制器作为父类控制器,Index控制器继承Base控制器 在父类控制器中初始化分配数据,子类控制器渲染模板: Base.php: assign('haha',$haha); } } Index.php: fetch(); } } index.html: {$haha} (与tp3.2相比,父类控制器不能是Public控制器) 【配置参数】 tp3.2里面使用C方法设置、获取配置参数 tp5使用助手函数 config() 设置、获取配置参数: //配置一个参数 config('name','lws'); //批量配置参数 config([ 'info'=>['sex'=>'nan','aihao'=>'nv'] ]); //获取一个配置参数 echo config('name'); //获取一组配置参数 dump(config('info')); //获取一个二级配置参数 echo config('info.sex'); 【get传参】 tp5废除了url/参数名1/参数值1/参数名2/参数值2......这样的方式传参,还是老老实实用url?参数名1=参数值1&参数名2=参数值2......这样传吧。 控制器里打印$_GET: 'htmlspecialchars', 【数据库操作】 tp5的数据库配置文件在根目录 /application/database.php:(也可在模块下单独配置) 连接数据库:tp3.2支持M方法连接数据库,tp5使用 Db类 或 助手函数db() 查询数据:依旧使用 find()、select() 方法,查询一个字段使用 value() 方法代替getField() //查询一条 $artinfo = db('article')->find(); //查询全部 $artinfo = db('article')->select(); //查询一个字段 $artinfo = db('article')->value('article_title'); 添加数据:tp3.2使用add(),tp5使用 insert():返回插入条数 或 save():返回id //添加一条数据 $data['article_title'] = 'PHP是世界上最好的语言'; $data['article_content'] = '如题'; db('article')->insert($data); //或 db('article')->save($data); //添加多条数据 $data = [ ['article_title' => '标题1', 'article_content' => '内容1'], ['article_title' => '标题2', 'article_content' => '内容2'], ['article_title' => '标题3', 'article_content' => '内容3'] ]; db('article')->insertAll($data); 修改数据:tp3.2使用save(),tp5使用 update() //修改数据 $whe['article_id'] = 1; $data['article_title'] = '修改后的标题'; db('article')->where($whe)->update($data); 删除数据:没错还是 delete() //删除数据 $whe['article_id'] = 1; db('article')->where($whe)->delete(); db()助手使用起来比较方便,但每次都会重新连接数据库,因此应当尽量避免多次调用,建议还是使用Db类操作数据库。 Db类操作原生SQL: where('art_id', 1) ->select(); //以下为数据库配置了表前缀 // 插入记录 $res = Db::name('article') ->insert(['title' => '标题', 'content' => '内容']); // 更新记录 $res = Db::name('article') ->where('art_id', 1) ->update(['title' => "修改标题"]); // 查询数据 $res = Db::name('article') ->where('art_id', 1) ->select(); // 删除数据 $res = Db::name('article') ->where('art_id', 1) ->delete(); //链式操作举例 $artlist = Db::name('article') ->where('is_del', 'N') ->field('id,title,content') ->order('post_time', 'desc') ->limit(10) ->select(); } } 【切换数据库】 首先在数据库配置中配置多个数据库: // 数据库配置1 'db1' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'blog1', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => '123456', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'lws_', ], // 数据库配置2 'db2' => [ // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'blog2', // 数据库用户名 'username' => 'root', // 数据库密码 'password' => '', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'lws_', ], 使用connect方法切换数据库: query('select * from lws_article where art_id = 1'); $db2->query('select * from lws_article where art_id = 2'); } } 【系统常量】 tp5废除了一大堆常量: 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等 需要使用的常量可以自己定义,例如IS_GET、IS_POST 我在父类的初始化方法中定义了这两个常量: isGet()); define('IS_POST',request()->isPost()); } } 然后在子类控制器中就可以使用这个常量做一些判断: 'home/article/detial', ]; 或者使用 Route 类,效果一样: use think\Route; Route::rule('article/:id','home/article/detial'); 定义路由规则之后访问http://oyhdo.com/article/50即可 【url分隔符的修改】 修改 application/config.php 中的 pathinfo_depr : // pathinfo分隔符 'pathinfo_depr' => '-', 访问网址变为:http://oyhdo.com/article-50 【跳转、重定向】 tp3里面的正确跳转:$this->success()、错误跳转:$this->error()、重定向:$this->redirect(),在tp5里面同样适用(继承\think\Controller) tp5新增 redirect() 助手函数用于重定向: return redirect('http://www.oyhdo.com'); 更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。 希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。