倒腾thinkphp5的一些坑

一、Thinkphp5中No input file specified 问题解决

.htaccess文件中的

1
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

在默认情况下会导致No input file specified.

修改成

1
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]

官方教程https://www.kancloud.cn/manual/thinkphp5/content

二、路由

关闭路由,完全使用默认的PATH_INFO方式URL:

1
'url_route_on'  =>  false,

路由关闭后,不会解析任何路由规则,采用默认的PATH_INFO 模式访问URL:

1
http://serverName/index.php/module/controller/action/param/value/...

结构如图
其实可以省略index.php

1
http://192.168.199.245/thinkphp_5.0.24/public/test/abc/eat/who/st4ck

img

img

三、绑定默认模块

在public下的index.php加上

1
define('BIND_MODULE','test');

切记一定要在require __DIR__ . '/../thinkphp/start.php';之前
上方的url变为

1
http://192.168.199.245/thinkphp_5.0.24/public/abc/eat/who/st4ck

如果你的应用比较简单,模块和控制器都只有一个,那么可以在应用公共文件中绑定模块和控制器,如下:

1
2
// 绑定当前访问到index模块的index控制器
define('BIND_MODULE','test/abc');

那么url又变成

1
http://192.168.199.245/thinkphp_5.0.24/public/eat/who/st4ck

四、设置返回类型

设置为json

1
'default_return_type'    => 'json',

五、控制器初始化

1
如果你的控制器类继承了\think\Controller类的话,可以定义控制器初始化方法_initialize,在该控制器的方法调用之前首先执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace app\index\controller;

use think\Controller;

class Index extends Controller
{

public function _initialize()
{
echo 'init
';
}

public function hello()
{
return 'hello';
}

public function data()
{
return 'data';
}
}

如果访问
http://localhost/index.php/index/Index/hello

会输出

1
2
init
hello

六、数据库操作

前面嘚 use think\Db;

1
2
3
4
5
public function get_em()
{ $query = new \think\db\Query();
$query->table('emails');
return Db::select($query);
}

或者

1
2
3
4
public function get_em()
{
return Db::table('emails')->select();
}
1
2
3
4
public function get_em()
{
return Db::table('users')->where('id',1)->select();
}

插入数据

1
2
3
4
5
public function get_em()
{
$data = ['email_id' => 'bar1'];
Db::table('emails')->insert($data);
}

插入多数据

1
2
3
4
5
6
7
8
public function get_em()
{
$data = [
['email_id' => '3333'],
['email_id' => '2333']
];
Db::table('emails')->insertAll($data);
}

更新数据

1
Db::table('think_user')->where('id', 1)->update(['name' => 'thinkphp']);

删除数据

1
2
3
4
5
6
7
// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);

// 条件删除
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();

七、模型绑定

和传统mvc一样,一个ef框架
先新建一个model

1
2
3
4
5
6
7
8
9
<?php
namespace app\test\model;

class User extends \think\Model
{
// 设置当前模型对应的完整数据表名称
protected $table = 'emails';

}

默认优先使用外部设定的数据库,也可以自己拟定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
namespace app\test\model;

class User extends \think\Model
{
// 设置当前模型对应的完整数据表名称
protected $table = 'emails';

// 设置当前模型的数据库连接
protected $connection = [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'security',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => 'xxxxx',
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => false,
];
}

然后controller要使用

1
2
3
4
5
6
public function set_mo()
{
// 实例化模型
$user = User::all();
return $user;
}

前面需要加上

1
2
use app\test\model\User;
use think\Db;

修改属性

1
2
3
4
5
6
7
8
public function set_mo()
{
// 实例化模型
$user = User::get(1);
$user->email_id='hello kitty';
$user->save();
return $user;
}

八、模板

模板路径倒是很奇怪的样子

img

然后就是一些模板语法

1
2
3
4
5
public function fetch1(){
$view = new View();
$view->name = 'thinkphp';
return $view->fetch('index');
}
1
Hello,{$name}!

切换版本

通过以下命令获取测试环境代码:

1
composer create-project --prefer-dist topthink/think tpdemo

将 composer.json 文件的 require 字段设置成如下:

"require": {
    "php": ">=5.6.0",
    "topthink/framework": "5.1.x"
}
```,
然后执行 composer update,获取5.1.x