thinkphp5.1
介绍
此为初次tp5.1的系统学习
安装
Git安装
可以直接使用git版本库安装,ThinkPHP5.1
主要分为应用和核心两个仓库主要包括:
- 应用项目:
https://github.com/top-think/thinktps
- 核心框架:
https://github.com/top-think/framework
步骤:
-
克隆下载应用项目仓库
git clone https://github.com/top-think/think tp5
-
切换到tp5目录下,再克隆核心框架仓库(目录名称不要改变)
git clone https://github.com/top-think/framework thinkphp
入口文件及访问方式
ThinkPHP采用的是单一入口模式进行项目部署,无论完成什么功能都由此入口进入,其主要目的是为了提高安全性。
tp5.1默认的应用入口文件位于:public/index.php
静态文件存放地点(css/js/images):public/static/
url访问方式:
http://localhost(主机名)/index.php/模块/控制器/操作/[参数名/参数值...]
php设计模式
单例模式
常见的类构造方式如下
class Site
{
//属性
public $siteName;
protected static $instance = null;
//禁用掉构造器
private function __construct($siteName)
{
$this->siteName = $siteName
}
//获取本类唯一实例
public static function get Instance($siteName='1')
{
if(!self::$instance instanceof self)
{
self::$instance = new self($siteName);
}
return self::$instance;
}
}
工厂模式
批量生成类对象
class factory
{
//创建指定类实例
public static function create()
{
return Site::getInstance(siteName:'帅康');
}
}
注册树模式
- 注册:set()把对象挂到树上
- 获取:get()把对象取下来用
- 注销:_unset()把对象弄死
class Register
{
//创建对象池:数组
protected static $objects = [];
//生成对象并上树
public static function set($alias,$object)
{
self::$objects[$alias] = $object;
}
//从树上取下对象
public static function get($alias)
{
return self::$objects[$alias];
}
//把树上的对象销毁
public static function _unset($alias)
{
unset(self::$objects[$alias]);
}
}
//将Site类的实例上树
Register::set('1',Factory::creat());
//从树上取一个对象下来
$obj = Register::get('1');
//销毁对象
Register::_unset('1');
自动依赖注入
允许向类中的方法中传递对象
常见命名空间
名称 | 描述 | 实际位置 |
---|---|---|
think | 系统核心类库 | thinkphp/library/think |
traits | 系统Trait类库 | thinkphp/library/traits |
app | 应用类库 | application |
公用类Temp
name = $name;
}
public function set($name)
{
$this->name = $name;
}
public function get()
{
return '当前方法为:'.__METHOD__.'当前属性为:'.$this->name;
}
}
?>
在Demo类中使用依赖注入,为当前方法传入一个自动实例化的类,实例化后赋值给$temp变量
set($name);
return $temp->get();
}
public function getInfo(\app\common\Temp $temp)
{
return $temp->get();
}
public function getName(\app\common\Temp $temp)
{
return $temp->name;
}
}
?>
Facade静态代理
可以让类无须实例化就可以静态掉用类里面的方法
目录位置: app/common(自建)/Test.php
被代理类Test
目录位置: app/facade(自建)/Test.php
静态类文件,注意一定要和你需要被代理的那个类名相同
目录位置: app/index/controller/Demo.php
调用静态代理类中的方法
hello();
使用静态代理访问可以看成app\facade\Test替代了app\common\Test中的内容
*/
public function index()
{
return Test::hello();
}
}
?>
Request请求对象
用来获取浏览器传回来的数据等信息
以下为Demo案例
get());
}
}
//以下为静态代理方法
//Request静态代理创建见上一条
class Demo extends \think\Controller
{
public function test()
{
dump(Request::get());
}
}
//以下为依赖注入方法
class Demo extends \think\Controller
{
public function test(Request $request)
{
dump($request->get());
}
}
?>
数据库
全局配置
数据库全局配置位于:config/database.php
where('id',1)->find();
//查询多条语句
Db::table('表名')->where('sex','男')->select();
//查询某个字段值
Db::table('表名')->where('id',1)->value('name');
//查询某一列的值
Db::table('表名')->where('sex','男')->column('name')
//使用助手函数
db('表名')->where('id',1)->find();
//处理大量数据集
$cursor = Db::table('user')->where('status', 1)->cursor();
foreach($cursor as $user)
{
echo $user['name'];
}
//插入语句
$data = ['sex' => '男','name' => '1'];
Db::name('表名')->insert($data);
//如果不希望无关字段报错,可以使用下面一条,他会将不存在的字段直接抛弃
$data = ['sex' => '男','name' => '1'];
Db::name('表名')->strict(false)->insert($data);
//添加多条语句
$data = [
['name' => '1', 'sex' => '男'],
['name' => '彭于晏', 'sex' => '男'],
['name' => '迪丽热巴', 'sex' => '女']
];
Db::name('表名')->insertAll($data);
//更新数据
Db::name('user')
->where('id', 1)
->data(['name' => '彭于晏'])
->update();
//删除数据
//根据条件删除
Db::table('think_user')->where('id','<',10)->delete();
//根据主键删除
Db::table('think_user')->delete([1,2,3]);
}
}
?>
动态配置
'mysql',
'hostname'=>'127.0.0.1',
'database'=>'数据库名',
'username'=>'用户名',
'password'=>'密码',
])->table('表名')->where('id',1)->value('name');
}
}
?>
模型
mvc中的model层,自动对应数据表,不用每次操作都要选择数据表。
建议:
单独一个人做项目时可以直接使用Db类更加方便,但是如果同一项目多人合作就应当使用模型类。
新建文件夹:application/index/model/表名.php
跳转文件:application/index/controller/Demo.php
大部分增删改查操作和Db类似只不过不用每次都选择数据表
find();
}
}
?>
视图
模板渲染
常用方法:
控制器在继承系统控制器基类(\think\Controller)后调用fetch方法
格式:fetch('[模板文件]'[,'模板变量(数组)'])
典型用法
以下例子将会自动定位到相应的模板文件,规则如下:
当前模块/view/当前控制器名(小写)/当前操作(小写).html
app/index/view/demo/index.html
//假设此文件名为Demo.php
fetch();
}
}
助手函数
控制器并未继承系统的控制器基类,则使用系统提供的助手函数 view ,可以完成相同的功能:
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
// 渲染模板输出
return view('hello', ['name' => 'thinkphp']);
}
}
模板
渲染内容
如果希望直接解析内容而不通过模板文件的话,可以使用 display 方法:
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
// 直接渲染内容
$content = '{$name}-{$email}';
return $this->display($content, ['name' => '', 'email' => '[email protected]']);
}
}
模板赋值
在控制器继承了系统的控制器基类的情况下,可以使用 assign 方法进行模板变量赋值。
view()助手函数,fetch()和display()均支持直接传入模板变量,例如:
$this->fetch('index', [ 'name' => '凯', 'email' => '[email protected]' ]);
namespace index\app\controller;
class Index extends \think\Controller
{
public function index()
{
// 模板变量赋值
$this->assign('name','凯');
$this->assign('qq','2633990932');
// 或者批量赋值
$this->assign([
'name' => '凯',
'qq' => '2633990932'
]);
// 模板输出
//这时候只需要在view目录下的demo目录下的对应的html网页里面直接输入本控制器的变量就可以看见值啦,比如{$name},{$qq}
return $this->fetch('index');
}
}
模板布局
1.打开全局模板配置:config/template.php
2.添加如下信息:
return [
'layout_on' => true,
'layout_name' => 'layout',
]
此时模板渲染路径就会出现变化,在不开启layout_on布局模板之前,会直接渲染application/index/view/user/add.html模板文件,开启之后,首先会渲染application/index/view/layout.html 模板
thinkphp5.1大致内容如上,还有很多细节没有展现出来,打算之后在用thinkphp框架时再创建一个文档用来记录更多的细节问题。