thinkphp5.1学习笔记
tp配置技巧
配置的get和set
tp5.1的配置在config目录里,一个文件是一个一级配置项,每个文件一行是二级配置项。
use think\facade\Config;//导入Config 门脸
public function get(){
//获取全部配置
// dump(Config::get());
//只获取app配置项
dump(Config::get('app.'));
dump(Config::pull('app'));
//获取二级配置项
dump(Config::get('app.app_debug'));
dump(Config::get('app_debug'));//由于app是默认一级配置项,可以省略
dump(Config::has('default_lang'));//检查是否有这个配置项,true/false
dump(Config::get('database.hostname'));
}
public function set(){
//动态设置,静态设置是修改配置文件
dump(Config::set('app_debug'));
}
}
使用助手函数
public function helper(){
//助手函数不依赖于Config,不需要导入Config类
//dump(config());//获取全部配置,相当于Config::get()
dump(config('default_lang'));
dump(config('?default_lang'));//查看是否存在,true/false
dump(config('database.hostname','localhost'));//设置,返回新的设置值localhost
}
trait
trait 方法优先级小于父类,
当两个trait 方法同名,会出错,需要如下:
use Demo1 ,Demo2{
Demo1::hello insteadof Demo2;
Demo2::hello as Demo2hello;
}
容器/依赖注入/静态代理/请求对象
容器与依赖注入的原理
任何url的访问都是定位到控制器的,
<?php
namespace app\index\controller;
class Demo1
{
public function d1(\app\common\B $b){//拿B做参数,当访问的d1方法自动实例化一个B,但是URL里不含参数。
$b->speak();
}
}
<?php
namespace app\common;
class B
{
public function speak(){
echo "i am b and i am speaking";
}
}
调用 /index/Demo1/d1 ,得出i am b and i am speaking,
绑定一个类到容器
<?php
namespace app\common;
class B
{
private $name;
public function __construct($name='peterz')
{
$this->name=$name;
}
public function speakName(){
echo 'my name is'.$this->name;
}
}
<?php
namespace app\index\controller;
class Demo1
{
public function bindClass(){
\think\Container::set('Balias','app\common\B');
//或者使用bind('Blias','app\common\B)
$bb=\think\Container::get('Balias',['name'=>'constru']);
//或者使用app('Balias',['name'=>'constru']);
echo $bb->speakName();
}
}
访问http://localhost/tp5/public/index.php/index/Demo1/bindClass,得到:my name isconstru
将闭包绑定到容器
<?php
namespace app\index\controller;
class Demo1
{
public function bindClosure(){
\think\Container::set('CC',function($param){
return 'this is params:'.$param;
});
return \think\Container::get('CC',['param'=>'parameters']);
}
}
访问http://localhost/tp5/public/index.php/index/Demo1/bindClosure,得到this is params:parameters
facade静态代理使用
facade类在think\facade里
<?php
namespace app\common;
class B
{
public function speak($param){
return 'i am '.$param;
}
}
<?php//这是B类的代理
namespace app\facade;
class Testfacade extends \think\facade
{
protected static function getFacadeClass(){
return '\app\common\B';
}
}
<?php//测试
namespace app\index\controller;
class Demo1
{
public function d1(){
return \app\facade\Testfacade::speak('tom');
}
}
http://localhost/tp5/public/index.php/index/Demo1/d1 输出: i am tom
动态代理
<?php
namespace app\common;
class B
{
public function speak($p){
return $p;
}
}
<?php
namespace app\facade;
class Testfacade extends \think\Facade //什么也不写,就是一个facade类
{
}
<?php
namespace app\index\controller;
class Demo1
{
public function d1()
{
\think\Facade::bind('app\facade\Testfacade','app\common\B');//动态代理,注意参数里app前面不要加\
return \app\facade\Testfacade::speak('tim');
}
}
控制器
控制器不依赖于Controller,但推荐继承Controller,
控制器里返回值一般是字符串,一般是return,
默认输出格式是html,也可以指定为其他的,比如 json,
request
使用静态Request
<?php
namespace app\index\controller;
use \think\facade\Request;
class Demo1
{
public function d1()
{
dump(Request::get());
}
}
http://localhost/tp5/public/index.php/index/Demo1/d1?name=%27tom%27&age=30
输出 array(2) {
["name"] => string(5) "'tom'"
["age"] => string(2) "30"
}
依赖注入方式:
public function d1(Request $request)
{
dump($request->get());
}
还可以用Controller里面的request
public function d1()
{
dump($this->request->get());
}
数据库
配置
1,全局配置 config/databas.php
2,动态配置: think\db\query.php
3.DSN连接: 数据库类型://用户名:密码@数据库地址:端口号/数据库名称/字符集
增删改查
<?php
namespace app\index\controller;
use think\Db;
class Demo1
{
public function d1()
{
/**
* 数据库操作入口类Db,静态调用\think\db\query.php
*/
$a=Db::table('student')
// ->field('id,name')
//SELECT `id` AS `编号`,`name` AS `姓名` FROM `student` WHERE `id` = 3 LIMIT 1
->field(['id'=>'编号','name'=>'姓名'])
->where('id','=',3)
->find();
dump(is_null($a)?'meizhaodao':$a);
}
//查询多条
public function d2(){
$a=Db::table('student')
->field('id,name,gender')
->where([
['id','<',4],
['id','>',1],
])->select();
foreach ($a as $b){
dump($b);
}
}
public function insert(){
$data=[
'id'=>6,
'name'=>'ppp',
'age'=>20,
'gender'=>'boy',
];
// return Db::table('student')->insert($data);//运行成功返回1
// return Db::table('student')->data($data)->insert();
//插入同时返回新增的主键
return Db::table('student')->insertGetId('$data');
}
//多条插入
public function insertmany(){
$data=[
['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
['id'=>6, 'name'=>'ppp', 'age'=>20, 'gender'=>'boy',],
];
return Db::table('student')->insertAll($data);
}
public function update(){
// return Db::table('student')->where('id',20)->update(['name'=>'ximenq']);
//如果更新的是主键,比如id
return Db::table('student')->update(['name'=>'ximenq','id'=>'20']);
}//此外还可以原生查询
}
模型输出
$nav=Catagory::where('id','>','0')->order('order')->select()->toArray();
$this->assign('nav',$nav);
模板中
{foreach $nav as $key=>$vo}
{$vo.name}
{/foreach}
$displayimg=Db::table('imageurl')->where('ifdisplay',1)->select(); //输出一样,不需要toArray();
$this->assign('img',$displayimg);
模板中{\(vo.title},{\)vo['title']}都可以,但是嵌入php时,需要用后者。
url生成示例
{:url('index/index/detail',['id'=>$vo['id'],])}