从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:

<VirtualHost *:80>
    ServerAdmin 1977629361@qq.com
    DocumentRoot /var/www/tp/public
    ServerName tp.oyhdo.com
    ServerAlias  tp.oyhdo.com
    DirectoryIndex index.php index.html index.htm    
</VirtualHost>

根目录下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文件内容为:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks -Multiviews
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

去掉index.php也可访问:

【隐藏前台url模块名】

把index模块作为前台,在前台新建了一个User控制器:

<?php
namespace app\index\controller;

class User
{
    public function user()
    {
        return '这是User控制器的user操作';
    }
}

正常需要这样访问User控制器的user操作:

为了前台url显示简洁一些,要去掉模块名index,然后就崩了:

如果只有一个模块,可以在/application/common.php中添加:

// 绑定当前访问到index模块
define('BIND_MODULE','index');

亲测访问成功:

但是项目通常会有前后台的区分,至少两个模块, 用上面的方法绑定index模块后,再访问其它模块就会报错:

(新建了一个admin模块作为后台)

<?php
namespace app\admin\controller;

class Index
{
    public function index()
    {
        return '这是后台首页';
    }
}

对于多模块的情况,可以在/application/route.php中绑定默认模块路由(去掉上面的单模块绑定):

use think\Route;
Route::bind('index');

前台访问成功:

然后在/public/下新建一个入口文件admin.php,绑定后台模块admin,来访问后台:

<?php
// [ 应用入口文件 ]
namespace think;
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/base.php';
// 绑定当前入口文件到admin模块
Route::bind('admin');
// 关闭admin模块的路由
App::route(false);
// 执行应用
App::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');
   return json($arr);

   //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()

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        return $this->fetch();
        //return view();
    }
}

tp5分配数据的方式依旧使用$this->assign()

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
    	$name = 'lws';
        $this->assign('name',$name);
        return $this->fetch();
    }
}

index.html页面读取数据:

{$name}

(修改模板引擎标签 配置文件【tpl_begin】、【tpl_end】)


【继承父类控制器】

写一个栗子,新建一个Base控制器作为父类控制器,Index控制器继承Base控制器

在父类控制器中初始化分配数据,子类控制器渲染模板:

Base.php:

<?php
namespace app\index\controller;
use think\Controller;
class Base extends Controller
{    
    //初始化方法
    public function _initialize()
    {	
    	$haha = '快下班了';
        $this->assign('haha',$haha);
    }
}

Index.php:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Base
{
    public function index()
    {
        return $this->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:

<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
    public function index()
    {
        $getdate = $_GET;
        dump($getdate);	
    }
}

这样是不对滴:

这样就好使:

【安全获取变量】

tp3.2可以使用I方法安全获取get、post等系统输入变量

tp5中使用助手函数input()

//获取get变量
$data1 = input('get.name');

//获取post变量
$data2 = input('post.name');

//获取当前请求变量
$data3 = input('param.name');

//获取request变量
$data4 = input('request.name');

//获取cookie变量
$data5 = input('cookie.name');

//获取session变量
$data6 = input('session.name');

(注意:获取的数据为数组,要加上 /a 修饰符才能获取到)

$arr = input('post.arr/a');

【数据库操作】

tp5的数据库配置文件在根目录/application/database.php:(也可在模块下单独配置)

连接数据库:tp3.2支持M方法连接数据库,tp5使用助手函数db()

查询数据:依旧使用find()select()方法,查询一个字段使用value()方法代替getField()

//查询一条
$artinfo = db('article')->find();

//查询全部
$artinfo = db('article')->select();

//查询一个字段
$artinfo = db('article')->value('article_title');

添加数据:tp3.2使用add(),tp5使用insert()

//添加一条数据
$data['article_title'] = 'PHP是世界上最好的语言';
$data['article_content'] = '如题';
db('article')->insert($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();

【系统常量】

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

我在父类的初始化方法中定义了这两个常量:

<?php
namespace app\index\controller;
use think\Controller;
class Base extends Controller
{
    public function _initialize()
    {	
    	define('IS_GET',request()->isGet());
        define('IS_POST',request()->isPost());
    }
}

然后在子类控制器中就可以使用这个常量做一些判断:

<?php
namespace app\index\controller;
class Index extends Base
{
    public function index()
    {   
        if(IS_POST){
            echo 111;
        }else{
            echo 222;
        }
    }
}


lws博客
请先登录后发表评论
  • 最新评论
  • 总共81条评论