webdev8888

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时,需要用后者。
{php} echo mb_strcut($vo[\'text\'],0,150,\'utf-8\');{/php}

url生成示例

{:url(\'index/index/detail\',[\'id\'=>$vo[\'id\'],])}

分类:

技术点:

相关文章: